ある情報システムをWebアプリで作ってみようと思い、フォームを作成して情報を送信する仕組みを作ったときのことです。
モデルを介さないでコントロールにポストする方法で試していました。
通常フォームを構築するときにはフォームヘルパ―で作成すると楽なものですが、今回は普通にformタグを入力して一先ず送信。
フォームヘルパ―を使用せず、手入力でformタグを入れて構築した場合、セキュリティーの関係でCSRFエラーが発生することがあるそうなので、Token情報を以下の方法でinputのhiddenで用意した方がいいとのこと。
<input type="hidden" name="_csrfToken" autocomplete="off" value="<?= $this->request->getAttribute('csrfToken') ?>">
submitボタンの上あたりに配置し、いざ送信してみました。
CSRF token from either the request body or request headers did not match or is missing.
あれ?CSRFエラーが発生してしまいました。
tmpファイル内のキャッシュデータをクリアするという手段もあるようですが、試してみても同じエラーが発生。
保護機能を無効化するのはちょっと危険だし、どうしようと思ったところ、フォームの数が少ない情報のときに試してみたらなんと送信ができてしまいました。
tokenのinputは別に変えておらず、保護機能も無効化していないし、キャッシュもクリアしていません。
もしかして送信の情報量が関係している?
そこで、ある程度の消去法でエラーが発生する量から少しずつ減らしていって送信テストしてみることに。
すると、途中で以下のようなワーニング文字が発生しました。
PHP Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0
phpで1000件以上のデータをリクエストすると、データを1000件に制限されるのだそうです。
1000件もあったかな?w
ただ、これはphp側の問題で、もしかしたらこれが原因でDos攻撃とみなされてエラーが発生していたのかも。
この1000という制限はphp.iniで変更できるそう。ただ、サーバー側のファイルを変更するのはちょっと面倒。
.htaccessでもこの制限変更はできるそうなので、一先ずやってみました。とりあえず、php.iniの場合も残します。
// .htaccess
php_value max_input_vars 10000
// php.ini
max_input_vars = 10000
.htaccessを編集して保存し、ブラウザを更新して再度送信テストすると、なんと無事完了しました!
制限によるエラーが発生することもあるんですね、勉強になりました。
phpで大量の情報を一気に送信するようなシステムを構築する場合は、このような部分も気にする必要がありそうですね。