如果之前有人问过道歉 - 但在这种情况下,我觉得信息过多,而不是太少。在我看来,每个地方似乎都存在相互矛盾的观点。 任何澄清都将非常感激。
我有一个用户注册表单。我已经验证了不同的字段,但我没有在数据上使用任何清理函数(例如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>
答案 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