Webアプリケーションに対する攻撃の手法には色々なものがありますが、中でも有名なものにクロスサイトスクリプティング(「XSS」と略します)があります。
XSS(クロスサイトスクリプティング)とは
XSSは、あるサイトから別のサイトにスクリプトを送り込み、悪意あるスクリプトを、そうとは知らない訪問者に実行させます。このため、「クロスサイト(サイト横断的な)スクリプティング(スクリプト処理)」と呼ばれます。
この説明ではよく分からないかも知れませんが、実質的には、「PHPなどで、ユーザがフォームに入力した文字列を出力するときに、適切にエスケープしないと、スクリプトのコードがそのまま出力されて実行されてしまいますよ」ということです。
簡単な例
例えば、以下のようなPHPコードがあったとします。
<a href="/search.php?q=<?php echo $keyword; ?>">検索</a>
この場合、変数 $keyword の中身が「test」だったら、出力されるHTMLコードは以下のようになります。
<a href="/search.php?q=test">検索</a>
このコードには何ら問題ないですね。
しかし、変数 $keyword の中身が
「“><script>alert(‘attack!’);</script><a href=”」
だったらどうでしょうか。
この場合、出力されるHTMLコードは以下のようになります。
<a href="/search.php?q="><script>alert('attack!');</script><a href="">検索</a>
このコード、ブラウザで表示してみれば分かりますが、
<script>alert('attack!');</script>
このスクリプトのコードが実行されてしまいます。
この変数 $keyword の中身がサイトのフォームから受け取った値だとすると、フォーム経由で悪意あるスクリプトのコードを上記のようにして送られてしまうリスクに対して、対策がされていないと言えるでしょう。
これがXSS脆弱性です。
対策
XSS対策は、至って簡単です。
「ユーザに入力させた値を出力するときは適切にエスケープする」、これだけです。
具体的には、元のこのコードを・・・
<a href="/search.php?q=<?php echo $keyword; ?>">検索</a>
このように修正します。
<a href="/search.php?q=<?php echo htmlspecialchars($keyword); ?>">検索</a>
これでXSS対策は基本的にはOKです。
htmlspecialchars はPHPの組み込み関数で、HTMLにおいて特殊な意味を持つ文字(< とか “ とか)をHTMLエンティティ(< とか " とか)に変換してくれます。
こうしておくと、出力されるHTMLコードは
<a href="/search.php?q="><script> alert('attack!');</script><a href="">検索</a>
となり、スクリプトのコードは無効化されているため、安全です。
まとめ
XSSは非常に有名な攻撃手法ですが、それでも多くのWebアプリケーション(動的なWebサイト)が対策をしていないのが現状です。
たったこれだけの対策でも、しているのとしていないのでは安全性が全く違ってきますので、Webアプリケーションを公開する場合は、手を抜かずにしっかりセキュリティホールを埋めるように気をつけましょう。