勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPでお問い合わせ等のform構築時にCSRF対策を行う方法

  PHP

他社が制作されたお問い合わせフォームを改修する案件があった。ソースコードを拝見しているとトークンを送信しており、なんだこれ? となったので調べてみるとクロスサイトリクエストフォージェリ(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

  関連記事

PHPとLINEを連携させて通知を送る方法(file_get_contents / curlの2パターン)

PHPとLINEを連携させ、LINEに何らかの通知メッセージを送信したい。以下に ...

PHPでJSONデータを見やすく整形した上で表示させる方法

PHPで何らかのデータをjson_encodeでJSONに変換し、そのままech ...

PHP5.4系でAPCが上手く動かなかったので5.5にアップデート&Zend OPcache導入

PHP5.3系から5.4系にアップデートしてから、WordPressがちょっと重 ...

PHPで外部ファイルから配列を取得

やりたかった事。 ①管理画面で必要項目を入力すると、aaa.phpが 生成される ...

PHP8系で「Warning: Attempt to read property "xxxxxx" 」エラーの対応方法

PHP8系&WordPress6.4.3で「Warning: Attem ...