来週PHPプロ・スタッフの面接があるのでかなりの確率で質問されるというWebアプリケーションのセキュリティに関して調べてみました。
■抑えておく用語
・XSS(クロスサイトスクリプティング) →フォームから入力した値がHTMLの一部として実行される場所で悪意あるスクリプトを動かしたり。具体的にはクッキーをパクッて他人のセッションを奪ったり。
・SQLインジェクション →SQL文を流し込むこと。例えばフォームの値をwhere句の条件に使う場合、入力フォームに”“1 or id = 2”“と入力したら・・・。
"update foo set cost = 100 where id = ".$_POST["id"];
・セッションハイジャック →他人のセッションを乗っ取ること。セッションIDの入ったクッキーがXSSによって盗まれたり、そのIDを使って成りすまされたり。
■対策
・GETパラメーター改竄 →GETの使用を最小限に留める。(Action=xxx的な処理の振り分けのフラグだけとか)
・HIDDEN値改竄(そしてAction値をフルパスに変更) →HIDDENを使わない。セッションにする。
・XSS →POSTにhtmlspecialchars。
・セッションハイジャック →セッションIDを単純な値にしたりCookieが盗まれなければ大丈夫。PHPのデフォルト設定ならそこそこ安心?(セッション有効時間24分、セッションIDはCookieに保存、Cookieはブラウザ閉じたら削除)
・SQLインジェクション →フォーム値の地道なValidationしかない?