ミニミニブログにCSRF脆弱性

 前回に引き続き、はじめてのPHPプログラミング 基本編5.3対応のゆるいところ第三段は、本書に紹介されているミニミニブログにクロスサイト・リクエストフォージェリ(CSRF)脆弱性があるというものだ。
 このミニミニブログは、BASIC認証を利用していて、twitterwassrなどのように一行コメントが書き込めるというものだ。BASIC認証、投稿機能があればCSRF脆弱性の対策が必要だが、本書にはCSRFに対する解説は特にないので、調べるまでもなくCSRF脆弱性があるのだろうと思っていた。
 しかし、人様の書籍に確認もしないで脆弱性指摘をするのも失礼なので、以下のように簡単な検証コードを書いて試してみた。

<html><body>
<form action="http://localhost/hajimete_php5/miniblog/index.php" method="post">
<input type="hidden" name="input_text"
	value="こんにちはこんにちは、僕本当はPHP嫌いなんだ">
<input type="submit" value="投稿する">
</form>
<script>
document.forms[0].submit();
</script>
</body></html>

ごらんのようになんのヒネリもないCSRFだが、あっさり動いた。現実にこれを悪用する場合は、非表示のiframe要素に埋め込むなどして、ユーザには見えないところで処理されるようにする(悪用禁止)。
[使用前]

[使用後]

 CSRFは、他のXSSSQLインジェクションとは異なり、意識的に対策しない限り混入してしまう。一方、XSSSQLインジェクションは、「どんな文字に対しても正しく処理できるようにする」という意識があれば自然に脆弱性対策になるので、この点がCSRFに対する意識付けが重要な理由である。
 だから、本書のような入門書であっても、CSRFの解説はして欲しいと思う。CSRFに対する啓蒙は重要だ。なにせ、ルータやファイアウォールのようなセキュリティ製品であってもCSRF脆弱性が珍しくないのだから。
 なお対策としては、トークン埋め込みがよいと思うが詳しくは、「安全なウェブサイトの作り方」などを参照していただきたい。