勉強したことのメモ

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

  関連記事

CentOSでPHPを5.5から5.3にバージョンダウンする方法

事情があってVPSに入れているPHPを5.5系から5.3系にバージョンダウンした ...

PHPにて「みんなの自動翻訳」のAPIで指定したテキストの言語判定する方法

迷惑メール対策等でメール本文が日本語のもののみ受信したい場合がある。ただ、本文内 ...

PHPのLocationにGETパラメータとして変数を入れる方法

PHPでページ遷移したい際に以下のように記述すると思う。 header("Loc ...

PHPでtwitterとfacebookのいいねやフォローのカウント数を取得する方法

PHPでtwitterとfacebookのいいねやフォロー数を取得して表示させた ...

CodeIgniter4で特定のページにアクセスがあった際に301リダイレクトさせる方法

CodeIgniter4で特定のページにアクセスがあった際に301リダイレクトさ ...