クロスサイトスクリプティング(XSS)とは
一言で言うと脆弱性がある掲示板のようなウェブサイトに、悪意のある第三者がそこへ罠を仕掛け、サイト訪問者の個人情報を盗むなどの被害をもたらす攻撃です。 ある掲示板サイトがあったとして、そこに悪意を持ったユーザがJavaScript等で作成した不正なスクリプトを含んだリンクを投稿します。 もし掲示板に脆弱性があるとそのスクリプトが掲示板に埋め込まれ、他のユーザが投稿されたリンクをクリックしたりするとスクリプトが実行されてしまい以下のような被害が発生します。スクリプトが実行されたときの具体的な被害について
- 本物のWebサイト上に偽のWebサイトが表示される
- ブラウザが保存しているCookieを取得される
- 任意のCookieをブラウザに保存されられる
Webサイトの脆弱性のチェック方法(悪用厳禁)
HTMLのタグであるhrタグは知っていますか? 「hr」は「horizontal rule(水平方向の罫線)」の略で、水平の横線を引くためのタグです。 Webサイトのユーザが入力できる入力欄に<hr>のようなタグを投稿すると、もしユーザが入力した値に対してエスケープ処理していない脆弱性があるサイトだと『』 と投稿後このようにタグが長い横線に変換されます。 このようなサイトに<script>タグでJavaScriptを入力して送信するとそのスクリプトがサイト上で実行されてしまうためXSSの危険があります。 逆にちゃんとエスケープ処理しているサイトだときちんと<hr>として表示され、<hr>はタグではなく文字列として扱われます。 当然JavaScriptを投稿してもそれはただの文字列として扱われるのでスクリプトが実行されることはありません。
対策方法について
対策としてはユーザが入力して投稿する値は必ずエスケープ処理をすること。 PHPにはhtmlspecialcharsという便利な関数が用意されているので、それを使います。 使用方法は ``htmlspecialchars("エスケープしたい値", ENT_QUOTES, "UTF-8");`` です。 第2引数にENT_QUOTES を指定することで、ダブルクォートだけでなくシングルクォートも変換してくれます。 ユーザ名がPOST送信された場合は以下のようにします。$user_name = htmlspecialchars($_POST["name"], ENT_QUOTES, "UTF-8");
XSSを防ぐためにもユーザが送信した値は必ずこのようにエスケープ処理をしてください。