また旅

日々のこと、画面の中でのこと (今はIDCFクラウド、KUSANAGI、WordPress、Vagrant及びCodeIgniter).

PHP

CodeIgniterでフォームやAjaxからPOSTする時にハマった理由

なにはなくとも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でした。続くのかは不明……

-PHP