SQLインジェクション
SQLインジェクションとは
MySQLの仕組みを利用して、作成者の意図と違った動きをするように悪用されてしまう脆弱性のこと。
例えば、ユーザー名とパスワードの入力を受けてログイン可否のチェックを行うプログラムを考える。
下のようにユーザー名とパスワードをそれぞれ変数に格納する。
$username = $_POST["username"]; $userpass = $_POST["password"];
そして、下のようなSQL文によって該当するデータの探索を行う。
SELECT * FROM user_info WHERE name = '$username' AND password = '$userpass';
ユーザー名がuser1かつパスワードがuser1というログイン情報の入力があった際には、
SELECT * FROM user_info WHERE name = 'user1' AND password = 'user1';
というSQL文が生成される。
一方で、悪意を持った入力をすることで、WHERE文以下を必ず成り立つ式にすることで、不正にログインすることができる。
$username : user1 $userpass : ' OR 'A' = 'A
という入力を行うとどうだろう。
SELECT * FROM user_info WHERE name = 'user1' AND password = '' OR 'A' = 'A';
というSQL文が生成される。
この文では、passwordの入力で’とすることで、一旦条件文を終わらせている。
そのあと続くOR文以下で「AがAである」という自明に真な文を入力することで、ユーザー名とパスワードが一致していない場合でもログイン処理をくぐり抜けることができる。
このように、SQL文の特性は悪用され得る。
XSS対策
XSSとは、phpコードを入力フォームに入力することで、phpコードをプログラムの中に入り込ませ、意図しないプログラムを実装してしまうことである。 XSSは、クロスサイトスクリプティングと呼ばれている。
入力フォームにphpコードを入力されると実行されてしまう。
phpコードであることを示す、タグを含んだ記号含みの入力がコードとして実行されるのを防ぐべく、入力に含まれる記号を取り出す、エスケープ処理が必要となる。
この際は、入力に対してhtmlspecialchars/htmlentitiesといった関数を通すとエスケープ処理ができる。
htmlspecialchars/htmlentitiesの使い方は以下の通り。
htmlspecialchars(文字列, ENT_QUOTES, “UTF-8”) htmlentities(文字列, ENT_QUOTES, “UTF-8”)
デフォルトでは”のみHTMLエンティティに変換する、ENT_COMPAオプションのみが設定されている。
よって、”と’の両方をHTMLエンティティに変換するオプションである、ENT_QUOTESオプション無しで行うと脆弱になってしまうので注意が必要である。