【问题标题】:Preventing XSS with foreach loop使用 foreach 循环防止 XSS
【发布时间】:2013-12-20 03:40:37
【问题描述】:

是使用 foreach 安全还是这样做会导致更多安全漏洞?

<?php

    foreach ($_POST as $key=>$value){
        $_POST[$key] = htmlspecialchars($_POST[$key]);
    }

?>


<form method="POST" action="">
    <input type="text" name="test" value="<?=isset($_POST['test'])?$_POST['test']:''?>"/> 
    <input type="submit" />
</form>

VS.

<?php
     $_POST['test'] = htmlspecialchars($_POST['test']);
?>


<form method="POST" action="">
    <input type="text" name="test" value="<?=isset($_POST['test'])?$_POST['test']:''?>"/> 
    <input type="submit" />
</form>

【问题讨论】:

  • foreach 不会造成更多的安全漏洞,否则我们都会遇到麻烦。如果您认为这可能,那么您可能需要阅读有关数据清理的信息。
  • 无论如何,您都不应该更改 $_POST 中的值。您在需要执行转义/消毒的地方进行转义/消毒,而不是在您不知道如何使用数据的开始。你基本上是在重新创建一个相当于魔术引号的 html。
  • @FruityP 我只是想确保循环通过 $_POST 变量是获取 $_POST 下所有变量的有效方法。
  • @MarcB 为什么你不应该更改$_POST 中的变量,人们总是这么说,但我不明白为什么?仅仅是因为您想确保数据不受影响吗?
  • 那我一定是误解了你的问题,抱歉。看看这个问题:stackoverflow.com/questions/16659356/…

标签: php forms foreach xss


【解决方案1】:

如果用户尝试注入一个数组,那么htmlentities 会生成一个通知,你应该在调用它之前检查一个字符串,否则:

Notice: Array to string conversion 

我一直在使用 Acunetix(http://www.acunetix.com/),如果你能负担得起,它表明我的代码存在缺陷

【讨论】:

  • $_POST 变量不总是一个字符串吗?事件当它是一个数字?
  • 不,您可以在此处发送数组更多详细信息stackoverflow.com/questions/6152436/posting-array-from-form
  • 我可以将您的输入名称从 'user_name' 更改为 'user_name[$test]' 然后发布它会出现错误,否则您的 error.log 可能会堆积
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 2012-10-28
  • 2018-07-16
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多