勉強したことのメモ

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でステータスコードを取得する方法
PHPでステータスコードを取得する方法

サーバーの死活監視でUptimeRobotを使っていたけど、どうも正常に監視して ...

メールサーバーを構築せずにGmailのSMPTを使ってPHPでメール送信
メールサーバーを構築せずにGmailのSMPTを使ってPHPでメール送信

メールサーバーが立てられなかったり、無料サーバーのため使えなかったりといった場合 ...

PHPで簡単にCSVファイルの生成
PHPで簡単にCSVファイルの生成

簡単にデータ並べるだけのCSVファイル生成。 file_put_contensで ...

PHPにてユニークかつランダム英数字の文字列を作成する方法
PHPにてユニークかつランダム英数字の文字列を作成する方法

PHPでユニークな文字列を作成したかった。MySQLとかのオートインクリメントの ...

FLASHから受信した画像をPHPで保存し、サムネイルも作る
FLASHから受信した画像をPHPで保存し、サムネイルも作る

■参考サイト ・FLASH http://www.ilovex.co.jp/bl ...