外部からの攻撃を防ぐ、XSS対策のエスケープ処理について理解を試みてみた

はじめに

初心者がPHPの勉強をしたのでアウトプットしていく。
とにかく最速でアプリを作るための勉強なので、作りたいものに特化したアウトプットになる。
今回は外部からの攻撃を防ぐ、XSS対策のエスケープ処理について。

XSSとは

「xss」とは「クロスサイトスクリプティング」の略でWebアプリケーションの脆弱性もしくはそれを利用した攻撃。
具体的には脆弱性がある掲示板のようなウェブアプリケーションに、悪意のある第三者が罠を仕掛け、サイト訪問者の個人情報を盗むなどの被害をもたらす攻撃のこと。

実際にあったXSS被害

Twitterの脆弱性を使ったコードが急速に拡散し、意図しないツイートをしてしまうケースなどが多発している。当面の対策として、WebブラウザからTwitter公式ホーム画面にアクセスしないなどの対策をセキュリティーソフト会社やユーザー有志が呼び掛けている。

参考:Twitterの“XSS騒動”はどのように広まったか

他にもYouTubeでも同様の被害が起こった。
上記例は実害がなかったが、他のサイバー攻撃では偽のログイン画面に飛ばし、そこに記入させたログイン情報を盗まられといった被害も生まれている。

実際に攻撃してみる

<!-- test.php -->
<!-- 入力フォーム作成 -->
<form action="test_result.php" method="POST">
 <input type="text" name="test">
</form>


<!-- test_result.php -->
<!-- test.phpで受け取った値を出力する。 -->
<?php
$test = $_POST['test'];
echo $test;
?>


作成したフォームに「こんにちは」と入力すると、無事に遷移先で「こんにちは」と表示された。
次に悪意のある文章を入れてみる。
例えば、<script>alert('xss攻撃!');</script>というスクリプトをフォームに記入してみると、遷移先のページでアラートが表示された。
上記の事例から遷移先のページでスクリプトが実行されていることがわかる。
これを悪用すると、任意のページにリダイレクトさせたりすることも可能になる。

実際に防いでみる

test_result.phpecho $test;echo htmlspecialchars($test, ENT_QUOTES, 'UTF-8');に変更する。
そのうえで先ほど同様に<script>alert('xss攻撃!');</script>と入力すると文字列で「<script>alert('xss攻撃!');</script>」と表示される。
これにより、XSS攻撃を防げるようになった。
まるっとソースを載せておく。

<!-- test_result.php -->
<!-- test.phpで受け取った値を出力する。 -->
<?php
$test = $_POST['test'];
echo htmlspecialchars($test, ENT_QUOTES, 'UTF-8');
?>