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でGoogle翻訳を手軽に扱えるライブラリ「google-translate-php」の利用方法
サイト内で一部テキストのGoogle翻訳を行いたい。ただ、Google Clou ...
-
-
PHPで特定のサイトからのリクエストのみ受け付けて処理する方法
指定したサイトからのリクエストのみ受け付けて処理したいという状況があった。その他 ...
-
-
wp_mail関数でエンベロープFrom(Return-Path)が指定できない場合の対応方法
WordPress内に設置されたお問い合わせのフォームようなシステムでエンベロー ...
-
-
PHPでメルマガを配信する方法(1件ずつ送信するパターン)
以前にPHPでメルマガを配信する方法を書いたけど、BCCだと相手の名前などユーザ ...
-
-
カンマ区切りの文字列で最後のカンマを排除
文字列をカンマ区切りにして、カンマを取り外して 配列にする際、頭もしくはお尻につ ...