如果您发布一个名称以[]结尾的输入的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的唯一选项?
答案 0 :(得分:0)
你可以循环遍历POST数组,并以这种方式修复它们。 但是,既然你说你不打算需要这个,为什么不循环遍历_POST数组,检查是否有任何非字符串,然后抛出异常?没有必要给假想的黑客一个很好的后备或解决方法:)
foreach($_POST as $val) {
if (!is_string($val)) {
throw new InvalidArgumentException('POST arguments should be strings only');
}
}
我发现处理此类问题的最佳方法是严格处理,并在客户端(浏览器/恶意人员)明显搞乱内容的情况下抛出异常;)