勉強したことのメモ

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で他サーバにHTTP経由にてファイルをアップロードする方法
PHPで他サーバにHTTP経由にてファイルをアップロードする方法

formで画像を送信した後、他サーバにファイルをアップロードしたかった。以前はP ...

PHPにて三項演算子をより簡単に書けるNull合体演算子について
PHPにて三項演算子をより簡単に書けるNull合体演算子について

PHPにて〇〇という変数もしくは配列に値があれば××という変数にその値を格納、無 ...

PHPにて指定した期間内の合計日数を出力する方法
PHPにて指定した期間内の合計日数を出力する方法

PHPにて開始日と終了日をユーザが入力すると、その期間内の合計日数を出力させたい ...

PukiWikiでバックアップを週一等スケジュール化して実行する方法
PukiWikiでバックアップを週一等スケジュール化して実行する方法

PukiWikiでバックアップを取りたかった。調べたらディレクトリごと保存すれば ...

ブログサービスの様にサブドメインを動的に生成する方法   
ブログサービスの様にサブドメインを動的に生成する方法  

ブログサービスの様に「hoge」というログインIDを作成した際「hoge.blo ...