在PHP中使用for循环提交的POST数据是否安全?

ACo*_*bbs 13 php security ajax

我总是担心我的PHP应用程序中的安全问题,我只是(可能)想到了黑客可能会破坏我的脚本的方式.目前我的应用程序采用表单数据并通过AJAX将其作为数组提交给PHP脚本,然后遍历此数组.

foreach($_POST['form_data'] as $field => $value){
   //Do something here.
}
Run Code Online (Sandbox Code Playgroud)

但是,如果黑客伪造一个AJAX请求,并重复提交带有1000亿随机元素的'form_data'数组怎么办?循环必须遍历每个元素,可能导致DoS(或至少减慢服务),是否正确?

我在这里没有完全接受过教育,所以我可能会有一些不正确的假设.感谢您的任何意见!

Nik*_*kiC 13

这不是问题:PHP使用max_input_vars指令限制POST变量的最大数量,默认为1000个变量.

实际上强制实施此限制是为了防止比您正在考虑的更严重的DOS攻击类型(实际上,迭代几千个数组元素就像什么都没有),即基于哈希表冲突的攻击(通常称为HashDOS).有关该问题的更多信息,请参阅我的文章Supercolliding a PHP array.


Pek*_*ica 6

循环必须遍历每个元素,可能导致DoS(或至少减慢服务),是否正确?

这是真的(尽管Web服务器的POST大小限制,并且脚本的内存限制可能会在100000000000项之前很久就停止了).

同样,@ duskwulf指出,PHP> = 5.3.9具有默认设置为1000 max_input_vars变量.

您仍然可以进行尺寸检查以确保安全.

  • 实际上,在PHP的现代版本中,你会遇到`max_input_vars`,它默认情况下限制为1000个输入元素. (4认同)
  • 确切地说 - `if(count($ _ POST ['form_data'])> $ expected)die("输入问题.");` (2认同)