换句话说,现在最常用的消毒输入和/或输出技术是什么?工业(甚至只是个人使用)网站的人们用什么来解决这个问题?
答案 0 :(得分:21)
您应该参考优秀的OWASP website来获取攻击摘要(including XSS)并对其进行防御。这是我能提出的最简单的解释,实际上可能比他们的网页更具可读性(但可能几乎没有完整)。
指定字符集。首先,确保您的网页在标题中或head
元素的最开头指定HTML编码的UTF-8字符集所有输入都可以阻止Internet Explorer(以及旧版本的Firefox)中的UTF-7 attack,尽管其他方面都在努力阻止XSS。
HTML转义。请记住,您需要HTML转义所有用户输入。这包括将<
替换为<
,>
替换为>
,&
替换为&
,"
替换为"
。如果您要使用单引号HTML属性,则还需要将'
替换为'
。典型的服务器端脚本语言such as PHP提供了执行此操作的功能,我建议您通过创建标准函数来插入HTML元素,而不是以临时方式插入它们来扩展它们。
其他类型的转义。但是,您仍然需要小心不要将用户输入作为不带引号的属性或解释为JavaScript的属性(例如onload
或onmouseover
)。显然,这也适用于script
元素,除非输入是正确的JavaScript转义,这与HTML转义不同。另一种特殊类型的转义是URL参数的URL转义(在HTML转义之前执行此操作以在链接中正确包含参数)。
验证网址和CSS值。由于javascript:
网址方案以及CSS,链接和图片的网址(未经批准的前缀验证)也是如此样式表URL和style
属性中的数据。 (Internet Explorer允许将JavaScript表达式作为CSS值插入,并且Firefox在XBL支持方面同样存在问题。)如果必须包含来自不受信任来源的CSS值,则应安全且严格地验证或CSS转义它。
不允许用户提供的HTML。如果您有选项,请不要允许用户提供的HTML。这是一种最终导致XSS问题的简单方法,因此基于简单的正则表达式替换为您自己的标记语言编写“解析器”。 I 只允许格式化文本,如果HTML输出是以明显安全的方式由真正的解析器生成的,该解析器使用标准转义函数从输入中转义任何文本并单独构建HTML元素。如果您对此无法选择,请使用AntiSamy等验证器/消毒剂。
防止基于DOM的XSS。请勿include user input in JavaScript-generated HTML code将其插入文档中。相反,请使用正确的DOM方法来确保将其作为文本处理,而不是HTML。
显然,我无法涵盖攻击者可以插入JavaScript代码的每一个案例。通常,仅HTTP cookie可用于使XSS攻击更难(但绝不会阻止),并且为程序员提供安全培训至关重要。
答案 1 :(得分:6)
XSS攻击有两种。一个是您的网站允许以某种方式注入HTML的地方。这并不难以防范:要么逃避所有用户输入数据,要么剥离所有&lt;&gt;标签并支持类似UBB代码的东西。注意:URL可能仍会让您受到滚动式攻击。
更为阴险的是某些第三方网站包含点击您网站上的网址的IFRAME,SCRIPT或IMG标记等,此网址将使用用户当前对您网站的任何身份验证。因此,您永远不应该采取任何直接行动来回应GET请求。如果您收到尝试执行任何操作的GET请求(更新个人资料,查看购物车等),那么您应该回复一个表单,而该表单又需要接受POST。此表单还应包含跨站点请求伪造令牌,以便没有人可以在设置为使用隐藏字段提交到您的站点的第三方站点上放置表单(同样,以避免伪装攻击)。
答案 2 :(得分:1)
您的代码中只有两个主要区域需要正确处理以避免xss问题。
在查询中使用任何用户输入值之前,对数据使用数据库辅助函数(如mysql_escape_string),然后在查询中使用它。它将保证xss安全。
在将用户输入值显示回表单输入字段之前,将它们传递给htmlspecialchars或htmlentities。这会将所有xss俯卧值转换为浏览器可以显示而不会受到损害的字符。
完成上述操作后,您对xss攻击的安全性超过95%。然后,您可以继续学习安全网站的高级技术,并在您的网站上应用额外的安全性。
大多数框架所做的是他们不鼓励你直接编写html表单代码或以字符串形式进行查询,因此使用框架帮助函数你的代码仍然是干净的,而任何严重的问题都可以通过更新一个或者快速解决。框架中有两行代码。您可以使用常用函数编写自己的小库,并在所有项目中重复使用它们。
答案 3 :(得分:0)
如果您使用.NET开发,避免XSS的最有效方法之一就是使用Microsoft AntiXSS Library。这是一种非常有效的消毒方式。
答案 4 :(得分:0)
在JSTL / JSP中,防止XSS的最佳方法是使用c:out标记而不将默认的escapeXml参数设置为false。
<c:out value="${somePossiblyDangerousVar}"/>