OpenPNEではPOSTもGETも$requests配列に格納され、メイン処理では$requests配列での処理がされる。
たとえば次のアドレスを開くと…
http://localhost/?m=pc&a=page_h_diary_add_confirm&subject=test&body=test&public_flag=public
内容が入力された状態の日記投稿の確認画面が表示されてしまう。
こんな感じで日記の投稿までされると怖い。
はまちちゃんとは
mixiの脆弱性をついて、特定のURLをクリックすると
ぼくはまちちゃん!
こんにちはこんにちは!!
という日記が勝手に投稿された事件を発端とする。
これに対し、mixiは確認ページを設けるようにしたが、 当然 根本的な対策ではないためURLを変更することで再度はまちちゃんは復活した。
CSRF(Cross-Site Request Forgeries)といわれる攻撃
OpenPNEでの対処法は、送信元でmd5(session_id())をPOSTに加え、 送信先でセッションIDとの整合性をとる手法です。
具体的な対策
doに値を送るときには必ずsessidを送らないといけない。
({t_form m=pc a=do_h_diary_add_insert_c_diary})
<input type="hidden" name="sessid" value="({$PHPSESSID})">
sessidはValidateでデフォルトで受信できるようになっている。
後学のために、これ以外の『はまちちゃん対策』の手法
- リファラーで発信元をチェック
- リファラを送らないブラウザでは使用できなくなる。
『ユーザが知らずにクリック⇒投稿』には万全といわれていたが、Flashではリファラの偽装ができる。
悪意のあるユーザにとっては、リファラは簡単に偽装できる。 - チェックコードを利用
- POSTするときに文字の書かれた画像を配置し、その文字を入力しないと投稿できないようにする手法。
実装コストがかかる。
ユーザにとって不便。 - GETは受けずに、POSTのみにする。
- JavaScriptを使えば勝手に投稿はできる。