###前提・実現したいこと
FuelPHPにてAndroidアプリと連携するRestAPIプログラムを作成しました。
Androidアプリで通信をしていると、送信されたPOST情報が欠落する場合があります。
POSTデータ量は30000程度で、下記のような内容となります。
sheets[1][details][13][sort]=14& sheets[1][details][9][sort]=10& sheets[4][details][6][info]=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX& sheets[0][sheetExid]=& sheets[4][details][1][inputLength]=30& sheets[1][details][41][checkInfo]=XXXXXXXXXXXXXXXXX& sheets[1][details][20][comment]=& sheets[1][details][52][answer]=Good& sheets[0][details][9][checkInfo]=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX& sheets[1][details][56][checkItems][1][checkItem]=N.A.& sheets[3][details][1][sort]=2& sheets[3][details][5][checkItems][0][checkItem]=Good& sheets[3][details][4][checkItems][2][checkItem]=NG& sheets[1][details][17][inputLength]=30& sheets[1][details][1][checkItems][0][checkItem]=Good& sheets[1][details][46][required]=2& sheets[1][details][26][required]=2& sheets[1][details][10][checkType]=RadioText& sheets[1][details][11][checkItems][1][checkItem]=N.A.& sheets[0][details][0][checkInfo]=XXXXXXXXXXXXXXXXXXXXXXXXXXX& sheets[2][details][20][sheetdetailExid]=123456789& sheets[2][details][29][checkItems][1][checkItem]=N.A.& sheets[2][details][7][checkType]=RadioText& sheets[4][details][4][checkType]=Text& sheets[2][details][19][checkTitle]=&
また、欠落箇所はPOSTデータの後ろ側が欠落していると思われます。
(Androidアプリ側でMap変数にPOST送信情報を設定して送信している為、配列の順番通りに取得出来ません)
但し、サーバ側のerror_log等にそれらしいログは出力されません。
(プログラム上で必須項目が欠落しているエラーになる為、問題が発見されました。
尚、該当の必須項目はAndroidアプリから必ず送信しています)
サーバ側でTCPDUMPにてパケットを覗いてみましたが、
そのタイミングではPOSTデータは欠落していませんでした。
ApacheやPHPの設定が怪しいと睨んで、
PHPのバージョンが5.3.3の為、関係はないと思いますが
max_input_varsの設定が無いためかと疑い、
PHP.iniに下記を記載しましたが、相変わらずPOSTデータが欠落してしまいます。
max_input_vars = 90000
その他、タイムアウトやメモリまわりの設定を確認してみたのですが、
それらがエラーとなった場合はWebサーバ上で500エラーとなるため、
それらの設定に問題はなさそうです。
現在の設定は下記となります。
max_execution_time = 30 max_input_time = 60 post_max_size = 256M memory_limit = 512M
本問題が発生して8ヶ月以上経つのですが、原因の特定と不具合修正ができず、質問させて頂きました。
ヒント等ありませんか。
###補足情報(言語/FW/ツール等のバージョンなど)
サーバ環境
linux centOS6.4
Apache2.2.15
PHP5.3.3
FuelPHP(1.7.0)
PHP導入パッケージ
ImageMagick 6.4.9-10
Ghostscript 9.05
ffmpeg
php-mcrypt
Androidアプリは中国にて利用し、サーバは日本国内にあります。
また利用しているデータは中国語となります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
PHP 5.3.3ですが、何かパッチを当てているということはないでしょうか?
5.3.3のソースを見てみましたが、少し見た限りでは直接リクエストの入力データの数を
数えるコードは、見当たりませんでした。
そこでパッチですが、
Doc Bug #65778 wrong information about introduction of max_input_vars directive
で言及がありますが、PHP 5.3.3-7+squeeze17には、max_input_varsがあるようです。
また、Suhosinモジュールには、
suhosin.request.max_vars、suhosin.post.max_varsという設定があるようです。
90000を指定するのであれば、
suhosin.request.max_vars = 90000 suhosin.post.max_vars = 90000
のようにすれば良いようです。
設定の説明は、ここにあります。
Suhosinモジュールが適用されているのであれば、
この設定により対処できる可能性があります。
max_input_varsが使用できるバージョンについて
正式なリリースとしては、ドキュメントにもある通り、5.3.9以降で使用できますが、
後述する通り、セキュリティ的な面で5.3.11以降、5.4.1以降の方が望ましいと思います。
正式なリリースとは別に、max_input_varsはセキュリティ的な問題(CVE-2011-4885)の対処のため、
パッチが存在し、rpmなどでは、パッチを含むバージョンがリリースされています。
なお、使用する際は、このパッチによって入り込んだCVE-2012-0830も対処されたバージョンが
望ましいと考えられます。
ちなみに、正式なリリースでCVE-2012-0830が修正されたのは、このコミットによると考えられますが、
これはphp-5.3.11、php-5.4.1でリリースされています。
php-5.3.3のrpmについて調べると、CVE-2011-4885は5.3.3-4、CVE-2012-0830は
5.3.3-7で対応しています。
max_input_varsの判定方法の変化について
max_input_varsの判定方法は、バージョンによって異なります。
- ハッシュの要素数による不完全な方法(php-5.4.0、php-5.3.10以前)
zend_hash_num_elementsを使っており、PostデータにArrayがある場合に、 Arrayのサイズがmax_input_vars+1になった際にエラーメッセージを出し、 max_input_vars+2以上になると無視します。 例) data[100][100][100]のデータは、1000000件になりますが、max_input_varsが1000の場合、 それぞれのサイズは100なので、制限にかからず、全てのデータを読み込んでしまいます。
- 正確な方法(php-5.6以降 、php-5.5以降、php-5.4.1以降、php-5.3.11以降)
Improved max_input_vars directive to check nested variablesというコミットによって修正されました。
実際にパースしながら、データの数を数え、データの数がmax_input_varsを超えると、 エラーメッセージを出して無視します。
投稿2015/11/18 11:37
編集2015/12/02 13:19総合スコア1546
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/19 01:35
2015/11/19 04:06
2015/11/19 07:21
2015/11/19 10:06
2015/11/19 11:21
2015/11/20 07:13
2015/11/20 07:17
2015/11/20 07:20
2015/11/20 12:47 編集
2015/11/26 02:21
2015/11/26 03:04
2015/11/26 09:29
2015/11/26 09:38
2015/11/26 12:56
2015/11/26 13:46
2015/11/27 00:47
2015/11/27 00:59
2015/11/27 05:00
2015/12/01 08:59
2015/12/01 09:30
2015/12/02 09:47 編集
2015/12/03 11:50
2015/12/03 12:33
2015/12/03 12:35
2015/12/04 01:34
2015/12/04 02:37
2015/12/04 04:05
2015/12/04 04:32 編集
2015/12/04 05:40
2015/12/04 09:36
2015/12/04 10:08 編集
2015/12/07 11:13
2015/12/07 12:15 編集
2015/12/11 04:28
2015/12/11 04:38
2015/12/24 01:21
2015/12/24 02:20
2015/12/24 08:29
2015/12/25 09:43
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。