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とLINEを連携させて通知を送る方法(file_get_contents / curlの2パターン)
PHPとLINEを連携させ、LINEに何らかの通知メッセージを送信したい。以下に ...
-
-
PHPのOpenSSL関数で文字列の暗号・復号化を行う方法
だいぶ前にPHPでBlowfishアルゴリズムを用いた暗号化と復号化する方法をメ ...
-
-
PHPで配列に特定の値が入っているか検索
PHPで配列に特定の値が入っているか検索して trueかfalseを返したい、と ...
-
-
PHPのHTTPクライアント用ライブラリ「Guzzle」の利用方法
以前に「Requests for PHP」を試したが、似たようなライブラリで「G ...
-
-
Stripe Checkoutにてクレジットカード決済の際に3Dセキュア対応にする方法
先日Stripe Checkoutを用いたクレジットカード決済機能についてメモし ...