なにはなくともCodeIgniter 3.x
ハマるためにはCodeIgniter 3.xを用意して下記ファイルの設定を変更します。
application/config/config.php
csrf_protection
$config[‘csrf_protection’] = TRUE;
csrf_protection の箇所をTRUEに書き換えて下さい。これでCodeIgniter組み込みのCSRF対策の仕組みが動き出します。動き出すと言ってもフォームやAjaxでPOST送信しない限りは何もしません。
ただこの時点でもForm Helperのform_open関数を使ってフォームのタグを出力しないと、CSRFのトークンのhiddenタグが出力されず、POST送信すると「An Error Was Encountered」となります。理由はトークンが送られてないためです。form_open使わない場合はget_csrf_token_name()及びget_csrf_hash()でトークンを出力しときましょう。
続きましてー、このまま例えば問い合わせフォームなどを作ってって、送信、戻るボタン押して、送信って操作を行うと、さっきと同じ「An Error Was Encountered」となります。これはそういう設定になってるためです。
csrf_regenerate
さっき変更した csrf_protection のちょっと下に csrf_regenerate ってのがあります。これは送信の度にトークンを作り直すっていうセキュリティ重視の設定です。これがデフォルトでは TRUE なので戻る押されるとトークンが再作成されず、送信するとエラーとなります。
私はさくっとFALSEにしちゃいましたが、戻る押されない前提、もしくは押されても問題無く動くのならTRUEのままで。
Ajax
続いて、Ajax、ここまで読めば分かる通り、AjaxでもPOSTするならトークンを送信する必要があります。例えばjQuery前提で、フォームの内容を送信するなら下記の通りです。もちろんトークンが含まれるフォームの場合です。
$.ajax({
url: “送信先”,
type: “POST”,
data: $(“form”).serialize(),
})
トークンだけでいい場合は
data: $(‘input[name=”ci_csrf_token”]’).serialize(),
とかでいけます。
以上、CodeIgniter入門その1でした。続くのかは不明……