勉強したことのメモ

webプログラマが勉強したことのメモ。

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

  関連記事

GoogleスプレッドシートとPHPの連携

GoogleスプレッドシートとPHPプログラムを連携させたいという案件をたまに見 ...

PHPでみたいに省略して書く際の設定

さくらvpsで<?=$hoge;?>とか省略して書こうとしても書けな ...

MySQLでIPを整数値としてカラムに格納する

MySQLでIPを整数値としてカラムに格納しているケースがあった。今までIPが必 ...

PHPのログイン認証をPEAR::Authで実装する

PHPのシステムである程度ちゃんとしたログインシステムが必要になった。今までログ ...

jQuery.uploadでリアルタイムプレビュー

やりたい事は、 ・<input type="file">で画像を選択 ...

PHPでクエリ内容を取得する

エラーログを確認している際によく分からない動作に なっているところがあった。 ペ ...

GoogleアナリティクスのデータをPHPで取得する方法

Googleアナリティクスの特定データをPHPで取得して、表示なりCSV化してほ ...

Opauthで「Please change the…」エラー

Opauthを使用中に「Notice: Please change the va ...

phpMyAdminより高速で軽量なAdminerが凄い

MySQLをGUIで管理できるphpMyAdmin。特に不満はないんだけど、もっ ...

no image
短縮URL作成(管理画面)

error_reporting(E_ALL & ~E_NOTICE); ...