見出し画像

#20 XSSの説明を何回読んでもわからないので試してみる【ぴよぴよコーダーの開発日記】

XSS(クロスサイトスクリプティング)は、攻撃者が入力フォームに不正なコードを入力してWebページを改ざんしたり、不正なファイルをダウンロードさせたりするものらしい。

頭ではふんわりわかるのだけど、どうゆうことかな。ということで、テストしてみました。まずは、PHPで基本的な入力フォームを作る。

index.htmlはこんな感じ

<form action="confirm.php" method="post">
 ■お問い合わせ内容を入力してください
 <input type="text" name="message">
 <br>
 <input type="submit" value="確認画面へ"></p>
</form>

confirm.phpはこんな感じでサニタイジング未実装状態

お問い合わせ内容:<br>
<?php echo $_POST['message'] ?>

これからindex.htmlをブラウザで開いて入力ボックスに不正なコードを入力して、確認画面(confirm.php)の内容を変えてみます。不正なコードはどうしよう。ラピュタの呪文のバルスをいっぱい表示させるとか。下記のJavaScriptのコードを入力フォームに入れてみます。

<script>document.body.innerHTML = "バルス!バルス!バルス!バルス!バルス!バル
ス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バ
ルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!
バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス
!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バル
ス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バ
ルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!
バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス!バルス
!バルス!バルス!バルス!";</script>

うわ。。。引くな。こんなコードを送信するとサニタイジングしていないプログラムだと、確認画面中が「バルス!」になることをローカル環境で確認しました。下記のようなコードを書くと意図しない画面に誘導されてしまったりもするだろうな。いずれもJSの初歩的なコードで。。。

<script>location.href = "やばいURLとか、やばいファイルも考えられる。"</script>

こうやって考えてみると、XSSやばいなということがよくわかりました。

プログラムを書くときはきちんとサニタイジングして安全性を高めよう。あたりまえのことですが。下記はサニタイジングの方法。

<?php
$message = htmlspecialchars($_POST['message'], ENT_QUOTES);
?>
お問い合わせ内容:<br>
<?php echo $message ?>

htmlspecialchars関数で、コード内の記号をHTMLエンティティ化して無害化させる( < なら &lt; になる)。ENT_QUOTES ではシングルクォートもHTMLエンティティ化できる。

参考:「クロスサイトスクリプティング(XSS)」とは?

参考:htmlspecialchars

参考:PHPのhtmlspecialcharsでのHTMLエンティティ化と、一文字に簡略化方法

この記事が気に入ったらサポートをしてみませんか?