セキュリティ

クロスサイトスクリプティング(XSS)とは

こんにちは、ともです。

この記事では、クロスサイトスクリプティング(XSS)という脆弱性について勉強したことをまとめます。

アプリケーションを作る際には、駆け出しエンジニアであっても、動けば良いというような気持ちで作ってはいけません。有名な脆弱性くらいはしっかりと理解し対処していきたいです。

そこで、駆け出しエンジニアである僕がPHPで『XSS』についての理解をまとめます。

クロスサイトスクリプティング(XSS)とは

XSSは『Cross Site Scripting』の頭文字をとりできました。頭文字をとると『CSS』となりますが、スタイルシートと混同しやすいため『XSS』となりました。

クロスサイトスクリプティング(XSS)とはユーザ入力により動的にHTMLを生成するサイトにおいて、出力情報をエスケープしない事が原因で起こる脆弱性です。

例えばHTMLの中に次の2つの文字列が挿入された場合を考えてみます。

// ①(問題無い)Hello Worldが埋め込まれた
<span>Hello World</span>

// ②(問題有り)スクリプトが埋め込まれた
<span><script>alert("攻撃!")</script></span>

①はただの文字列が埋め込まれただけですので問題ありません。

②のようにJavaScriptが埋め込まれた場合、alertメソッドが実行されてしまいます。

ブラウザが『<script>alert('攻撃!')</script>』をただの文字列として認識してくれれば問題が解決します。

対処方法

スクリプトをただの文字列として変換する処理をエスケープと言います。

PHPの場合、HTML側でJavaScriptをエスケープするにはhtmlspecialcharsメソッドが利用できます。

<span>
  <?php
    echo htmlspecialchars('<script>alert('攻撃!')</script>', ENT_QUOTES, 'UTF-8');
  ?>
</span>

第一引数にエスケープしたい文字列をセットし、第二引数にENT_QUOTESを指定しシングルクオートもエスケープするようします。

ただの文字列として表示できている事が分かります。

まとめ

とても簡単にですが、XSSについて解説しました。少しでも安全なアプリケーションを作成できるように、駆け出しであっても気をつけたいです。