如果您发布一个 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 的每次访问前添加一个 (string)-cast?
最佳答案
您可以循环遍历 POST 数组,并以这种方式修复它们。 但是,既然你说过你永远不需要这个,为什么不循环遍历 _POST 数组,检查是否有任何非字符串,然后抛出异常?不需要给假想的黑客一个很好的回退或解决方法:)
foreach($_POST as $val) {
if (!is_string($val)) {
throw new InvalidArgumentException('POST arguments should be strings only');
}
}
我发现处理此类问题的最佳方法是严格处理,并在客户端(浏览器/坏家伙)明显乱搞的情况下抛出异常 ;)
关于PHP,禁用自动输入[]到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11880142/