3

如果您发布一个带有名称以 [] 结尾的输入的 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"] 的代码将是一个数组!

我可以想象在某些情况下这将是一个安全问题,例如,startWith-function 可以在字符串和数组上工作。我还没有研究它的全部含义,我也不想,我只想完全禁用该功能,这样我就可以相信所有 $_POST 变量始终是字符串。

有什么方法可以全局禁用此功能,或者是查找-替换所有并在 $_POST 的每次访问前添加(字符串)-cast 的唯一选项?

4

1 回答 1

0

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

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

我发现处理此类问题的最佳方法是严格,并在客户(浏览器/邪恶的家伙)明显乱搞东西的情况下抛出异常;)

于 2012-08-09T09:20:04.730 回答