PHPでお問い合わせ等のform構築時にCSRF対策を行う方法
他社が制作されたお問い合わせフォームを改修する案件があった。ソースコードを拝見しているとトークンを送信しており、なんだこれ? となったので調べてみるとクロスサイトリクエストフォージェリ(CSRF)と呼ばれる攻撃の対策らしい。以下に実装方法等をメモ。
実装方法
フォームの入力ページに以下を追記する。
session_start(); //トークンを生成 $token = bin2hex(random_bytes(32)); //セッションにトークンを保存 $_SESSION['token'] = $token;
次にフォーム内容を受け取るページにて以下でトークンが正しいかチェックする。
session_start();
if( $_SESSION['token'] == $_POST['token'] ){
//トークンが正しい場合の処理
}else{
//NG時の処理
}
クロスサイトリクエストフォージェリ(CSRF)とは
第三者のサーバにフィッシング用のWebページを作成し、そのページの送信ボタンを押すことで本来のお問い合わせ完了ページにデータを送信するような攻撃とのこと。そのため送信前と送信後にトークンをチェックすることで対策になると。
CORSはどうなる?
CSRFの攻撃内容を見た際にCORSがあるから問題ないのでは? と思ったがそうじゃないらしい。こちらのサイトによるとCORSはJavaScriptでPOST等のリクエストをした際、リクエストは通るがレスポンスは得られないっぽい。リクエストが通るということはデータは送信されちゃうのでCSRFは成立すると。ややこしい。
所感
CSRF対策の実装自体はそこまで手間じゃないので、今後フォームを実装する際は必ず実装すること。
関連記事
-
-
PHPからMySQLにシリアライズしたデータを格納
アンケートフォームみたいなのがあって、 今後も定期開催し、尚且つ質問内容は増減す ...
-
-
MySQLで直近に挿入したオートインクリメントの値と次回挿入する値を取得する方法
phpとmysqliを使っている中で次回挿入するオートインクリメントの値と、前回 ...
-
-
CodeIgniter3でファイルキャッシュする方法
CodeIgniterでファイルキャッシュが楽に導入できた。そこそこ使いそうなの ...
-
-
PHPにて文字のあいまい検索(文字のゆれ)を実装する方法
Googleで検索する際に、ちょっと間違えて入力してしまっても「もしかして○○? ...
-
-
PHPで画像のフォーマット(拡張子)の変換
画像のアップロードでjpg/png/gif形式を受け付けつつ、 最終的にjpgで ...