SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】max_input_varsの影響でフォームの値を全部受け取れないことがある

問題

フォームから送信した値が、サーバー側(php)で取得できない。

プログラムは動いてるみたいなんだけど、あるはずの $_REQUEST[‘hoge’] などがないみたい。

どうなってるのこれ?

答え

以下の条件に当てはまるようなら、phpのmax_input_varsの設定値の影響かもしれない。


php5.3.9から有効となったmax_input_varsという設定項目がある。

max_input_vars integer

入力変数を最大で何個まで受け付けるかを指定します (この制限は、スーパーグローバル $_GET、$_POST そして $_COOKIE にそれぞれ個別に適用されます)。 このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。 このディレクティブで設定した数を超える入力変数があった場合は E_WARNING が発生し、 それ以降の入力変数はリクエストから削除されます。 多次元配列の場合、この制限は個々の次元ごとにしか適用されません。

http://www.php.net/manual/ja/info.configuration.php#ini.max-input-vars

そしてこの設定項目のデフォルト値は1000。

フォームに1000個以上入力欄やhiddden要素がある場合、ちゃんと送信されてくるのだが、phpに勝手に制限をかけられた状態となる。

再現ソース

1020個のinput要素のあるフォームからsubmitしてみる。

<html>
<head><title>max_input_varsのテスト</title></head>
<body>
<form action="" method="post">
<?php for ($i = 0; $i < 1020; ++$i) { ?>
<input name="x<?php echo $i; ?>" type="text">
<?php } ?>
<input name="x" type="submit">
</form>
<h3>POST DATA</h3>
<?php var_dump($_POST); ?>
</body>
</html>

結果

POSTデータが1000個目までしかない。


ちょっと古いphpからバージョンアップしたときなど、要注意。

業務系の画面では、行追加行追加…で1000個ぐらい平気で超えそうなフォームがあったりすることもある。

EC-CUBEの管理画面の商品規格入力なども、色サイズバリエーションが100個ぐらいある商品を入力しようとすると、問題の現象が発生するので、設定に注意。

設定は、php.ini、.htaccess で変更可能。

関連するメモ

コメント