【问题标题】:Do I need to htmlspecialchars() user input in an HTML form to prevent XSS?我是否需要在 HTML 表单中使用 htmlspecialchars() 用户输入来防止 XSS?
【发布时间】:2018-01-15 23:42:34
【问题描述】:

抱歉,如果之前有人问过这个问题 - 但在这种情况下,我觉得那里的信息过多,而不是太少。我所看到的任何地方似乎也存在相互矛盾的意见。 任何澄清将不胜感激。

我有一个用户注册表单。我已经验证了不同的字段,但我没有对数据使用任何清理功能(例如 htmlspecialchars),因为我读到 here 最好将其保留到输出(例如在用户配置文件中)。我正在使用 PDO 准备好的语句来插入我的数据,所以据我所知,我在那里是安全的。

但是,在通过各种漏洞扫描程序运行我的域后,他们报告说我的注册表单非常不安全 - 并且可能成为 XSS 攻击的受害者。我相信导致这种情况的代码的sn-p如下:

<input type="text" placeholder="Username" name="user" maxlength="32" value="<?php echo test_input($user); ?>" pattern="^[a-zA-Z0-9]*$" required>

我将用户的输入回显到表单中,以防他们在另一个字段中出现错误,以便在更正后重新提交。因此,可能会在页面中回显可能有害的脚本。

但是,这肯定只是来自特定用户的输入吗?他们可能造成的唯一伤害是对自己吗?是扫描仪弄错了还是我基本上没有意识到风险?

我有用于一般字符串、电子邮件地址、URL 的字段。我应该采取哪些措施来确保访问我网站的访问者的安全?

非常感谢您能给我的任何帮助/澄清!

编辑

function test_input($data)
    {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data, ENT_QUOTES | ENT_HTML5, 'UTF-8');
    return $data;
    }

【问题讨论】:

标签: php html xss


【解决方案1】:

我是否需要在 HTML 表单中使用 htmlspecialchars() 用户输入来防止 XSS?

你需要东西htmlspecialchars 通常是一个不错的选择。它很简单,不会破坏输入。

但是,这肯定只是来自特定用户的输入吗?

它位于特定用户的浏览器的输入中。

该用户可能访问了一个邪恶的第三方站点,该站点将 XSS 攻击作为其站点表单中输入的默认值。然后他们将表单的action 设置为您的 站点。然后他们用 JS 提交表单。

结果:他们的代码由用户的浏览器注入您的网站,他们的 JS 在您的网站上执行(访问用户的 cookie 和会话)。

【讨论】:

  • 啊,现在说得通了!太感谢了。因此,我可以将原始用户输入提交到我的数据库中(前提是我在输出时将其 htmlspecialchars),但是当将用户输入回显到表单中以进行更正时 - 在您给定的情况下,我也应该 htmlspecialchars 吗?
【解决方案2】:

将任何变量插入另一个上下文时,您还应该通过htmlspecialchars()(或上面的noHTML())运行它们,以确保它们不会中断并向父元素添加额外的属性。

这是安全的:

<input type="text" name="username" value="<?php echo noHTML($htmlp->purify($_GET['username'])); ?>" />

这对 XSS 攻击也是安全的,但仍然是个坏主意:

<?php echo $htmlp->purify("<input type=\"text\" name=\"username\" value=\"".$_GET['username']."\" />"); ?>

事实证明,上下文对于防止跨站点脚本攻击非常重要。在一种情况下是安全的(例如允许使用 HTML)在其他情况下可能是灾难性的(例如我们处于 HTML 属性的中间)。

完整来源:https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know

【讨论】:

  • 这是一个很好的来源,非常感谢。我同意使用 ENT_QUOTES 来保证安全,但是,如果我想在我的某个字段中允许单引号 (') 怎么办?否则“我不喜欢 XSS 攻击”不会输出为“我不喜欢 XSS”吗?
  • 您可以使用反斜杠“我不喜欢 XSS 攻击”来转义引号。如果您觉得我的回答有用,请给它点赞:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多