Java から PHP へのストリーム アップロードを実行すると、入力変数が の制限を超えているという PHP エラーが表示されることがありますmax_input_vars
。
最初は、その理由がわかりませんでした。最初に説明させてください:
ファイルは、次のようなアプローチでアップロードされています。
// get file data from input stream
$putdata = fopen("php://input", "r");
$tmp = tmpfile();
filesize = stream_copy_to_stream ($putdata, $tmp);
fclose ($putdata);
// copy temp stream into destination stream
$target = fopen('myfile.dwg', "w");
fseek($tmp, 0, SEEK_SET);
stream_copy_to_stream($tmp, $target);
fclose($target);
fclose ($tmp);
PHP がこのような警告を表示する理由を理解するために、送信されたデータのダンプを取りました。
file_put_contents ('input_vars.log', print_r ($_REQUEST, true));
file_put_contents ('php_input.log', file_get_contents ('php://input'));
ここで面白いのは、アップロードされているファイルが 1.8 メガバイトであるということです。結果のログは次のとおりです。
input_vars.log
=> 5 メガバイト、90,000 行php_input.log
=> 20 メガバイト、283,000 行
エラーメッセージが突然正当に見えるようになりました。にはバイトコードが含まれているphp_input.log
だけですが、次のinput_vars.log
ようにフォーマットされています。
Array
(
[filename] => 0018-101-001_67.dwg
[versionId] => 11253
[filetype] => dwg
[‘á‹Úê-8øFj–sÙ/ghÔ÷JJÐWhvPV] => ...
....
)
最初の 3 つのキーは GET 経由で送信され、残りはすべてファイル データになります。の一致を検索してカウントすると=>
、25,954 件の一致が得られます。REQUEST
次に、 26,000 個のキーを保持していると仮定します。
さて、私の質問に移りましょう。max_input_vars
値を数回上げましたが、現在は の値を保持しています30000
。このセキュリティ設定を無視して、可能な限り高く設定する必要がありますか? 私の懸念は、REQUEST 配列が より大きい場合、PHP が REQUEST 配列からパーツを削除30000
し、ファイルが破損することです。
この値を高く設定しすぎると、セキュリティ上の問題はありますか? ファイルを PHP にアップロードするより良い方法はありますか?