PHP,禁用自动输入[]到数组

时间:2012-08-09 09:12:37

标签: php html forms post

如果您发布一个名称以[]结尾的输入的html表单,php会自动将这些$ _POST值变为数组。

例如,没有括号:

<input name="email" value="a" />

var_dump($_POST["email"])    
//string 'a' (length=1)

括号:

<input name="email[]" value="a" />
<input name="email[]" value="b" />

var_dump($_POST["email"])    
//array
//  0 => string 'a' (length=1)
//  1 => string 'b' (length=1)

我的问题是以前我不知道这个,所以我一直在编码我的网站,假设$ _POST变量总是字符串类型。当然,我执行标准输入验证,但只假设变量已经是字符串。

那么,如果黑客接受我的正常输入之一,例如<input name="email" .../>并将其与后面的括号一起发布,那该怎么办?然后我的代码获取$ _POST [“email”]将是一个数组!

我可以想象有些情况会出现安全问题,例如startsWith-function可以同时处理字符串和数组。我还没有研究它的全部含义,我也不想,我只是想完全禁用该函数,所以我可以信任所有$ _POST变量永远是字符串。

有没有办法全局禁用此功能,或者是在$ _POST的每次访问前找到 - 替换all并添加(字符串)-cast的唯一选项?

1 个答案:

答案 0 :(得分:0)

你可以循环遍历POST数组,并以这种方式修复它们。 但是,既然你说你不打算需要这个,为什么不循环遍历_POST数组,检查是否有任何非字符串,然后抛出异常?没有必要给假想的黑客一个很好的后备或解决方法:)

foreach($_POST as $val) {
   if (!is_string($val)) {
      throw new InvalidArgumentException('POST arguments should be strings only');
   }
}

我发现处理此类问题的最佳方法是严格处理,并在客户端(浏览器/恶意人员)明显搞乱内容的情况下抛出异常;)