max_input_vars は入力変数の上限
PHP プログラマーの皆さま、 max_input_vars
をご存知でしょうか。
PHP では、受け取れる入力変数の数に上限があり、それが設定されているのが、
設定変数 max_input_vars
です。
max_input_vars
はデフォルトで 1000 に設定されています。
つまり、とくに設定を変えなければ、最大 1,000 個のパラメーターしか受け取れないということです。パラメーターを配列にしたとしても、配列の個数もカウントされます。
上記 PHP のマニュアルから max_input_vars
についての説明を引用します。
入力変数 を最大で何個まで受け付けるかを指定します (この制限は、スーパーグローバル
$_GET
、$_POST
そして$_COOKIE
にそれぞれ個別に適用されます)。
このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。
なるほど、セキュリティのためにパラメーターの数を制限しているんですね。
ハッシュの衝突を悪用した攻撃については以下の記事が詳しいです。
上限値を超えてもプログラムは止まらない
さきのマニュアルには、パラメーターの数が設定値を超えた場合の挙動についても説明されています。
このディレクティブで設定した数を超える入力変数があった場合は
E_WARNING
が発生し、 それ以降の入力変数はリクエストから削除されます。
ということで、パラメーター数が上限を超えたとしても、プログラムが止まるわけではないんです。
Warning に気づかなければ、そのまま実行されるけど後ろの方のパラメーターは処理されない、というハンパな状況も起こり得ます。ご注意ください。
なお、具体的な Warning のメッセージは以下のような感じです。
PHP Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0, referer:
設定できる場所
マニュアルを見ると、 max_input_vars
の変更可能モードは PHP_INI_PERDIR
となっています。 これは、 php.ini
や .htaccess
、 httpd.conf
などの設定ファイルで設定可能で、 ini_set()
関数を使ってプログラム中で上限を増やすことはできないということです。
まあ、プログラムに入ってくる変数の制限値なので、入ってきたあとのプログラムで設定変更できないのは当たり前といえば当たり前です。
具体的な設定方法ですが、 php.ini では以下のように、
max_input_vars = 2000
Apache の httpd.conf や .htaccess では以下のように設定してください。
php_value max_input_vars 2000
回避方法とか
max_input_vars の値を変えずに上限値を回避する方法ですが、以下のように入力変数の数を構造的に減らすような策が考えられます。
- 配列であれば、カンマなどの区切り文字でつないで一つの変数に入れて、プログラム側で explode する。
- パラメーターを JSONに加工して、body として受け渡し、プログラム側で json_decode する。
大量のパラメーターを扱う場合は、入力変数に上限があることに注意してシステムを設計していただければと思います。