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

标签 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 的每次访问前添加一个 (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/

相关文章:

PHP 5.4 - mySQL 阿拉伯字符

javascript - value() 和 focus() 不起作用

html - 无法找到使反增量工作的方法(Chrome/Firefox)

html - Bootstrap 中页脚下方的空白?

php - 无法通过PHP插入数据库

javascript - angularjs - 将某些带有数据的输入正确设置为 $pristine 或未触及

javascript - 如何防止使用 jQuery 或 Javascript 重复提交?

php - 我使用 mysql 命令没有从 ssh2_exec() 得到任何结果

php - 如何在 zf2 的 Controller 中执行查询

html - 添加 float /清除属性后图像变大了吗?