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

时间:2017-08-08 11:55:50

标签: php html xss

如果之前有人问过道歉 - 但在这种情况下,我觉得信息过多,而不是太少。在我看来,每个地方似乎都存在相互矛盾的观点。 任何澄清都将非常感激。

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

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

import Ember from 'ember';

export default Ember.Component.extend({
  actions:{
    showCaution : function(){
        alert("hi");
    }
  }
});

我正在回复该用户的输入,如果他们在另一个字段中出错,以便在更正后重新提交。因此,可能有害的脚本可以回显到页面中。

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

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

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

修改

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

2 个答案:

答案 0 :(得分:0)

  

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

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

  

但是,这肯定只是该特定用户的输入?

来自该特定用户浏览器的输入。

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

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

答案 1 :(得分:0)

当将任何变量插入另一个上下文时,您还应该通过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