换句话说,现在最常用的消毒输入和/或输出技术是什么?工业(甚至只是个人使用)网站的人们用什么来解决这个问题?
您应该参考优秀的OWASP网站,了解攻击(包括XSS)和防御攻击的摘要.这是我可以提出的最简单的解释,实际上可能比他们的网页更具可读性(但可能几乎没有完整).
指定一个字符集.首先,确保您的网页在标题中或head
元素的最开头指定UTF-8字符集HTML编码所有输入以防止在Internet Explorer(以及旧版本的Firefox)中进行UTF-7攻击,尽管有其他努力防止XSS.
HTML转义.请记住,您需要HTML转义所有用户输入.这包括替换<
用<
,>
具有>
,&
具有&
和"
用"
.如果你将永远使用单引号的HTML属性,您需要更换'
与'
为好.典型的服务器端脚本语言(如PHP)提供了执行此操作的功能,我建议您通过创建标准函数来插入HTML元素,而不是以临时方式插入HTML元素.
其他类型的逃逸.但是,您仍然需要小心,不要将用户输入作为不带引号的属性或解释为JavaScript的属性(例如onload
或onmouseover
)插入.显然,这也适用于script
元素,除非输入是正确的JavaScript转义,这与HTML转义不同.另一种特殊类型的转义是URL参数的URL转义(在HTML转义之前执行此操作以在链接中正确包含参数).
验证URL和CSS值.由于javascript:
URL方案以及CSS样式表URL和style
属性中的数据,链接和图像的URL(未经基于批准的前缀验证)也是如此.(Internet Explorer允许将JavaScript表达式作为CSS值插入,并且Firefox在XBL支持方面同样存在问题.)如果必须包含来自不受信任来源的CSS值,则应安全且严格地验证或CSS转义它.
不允许用户提供的HTML.如果您有选项,请不要允许用户提供的HTML.这是一种最终导致XSS问题的简单方法,因此基于简单的正则表达式替换为您自己的标记语言编写"解析器".如果HTML输出是由一个真正的解析器以明显安全的方式生成的,我将只允许使用格式化文本,该解析器使用标准转义函数从输入中转义任何文本并单独构建HTML元素.如果您对此无法选择,请使用AntiSamy等验证器/消毒剂.
防止基于DOM的XSS.不要在JavaScript生成的HTML代码中包含用户输入并将其插入到文档中.相反,使用适当的DOM方法来确保将其作为文本处理,而不是HTML.
显然,我无法涵盖攻击者可以插入JavaScript代码的每一个案例.通常,仅使用HTTP的 cookie可能会使XSS攻击变得更加困难(但绝不会阻止它),并且为程序员提供安全培训至关重要.
XSS攻击有两种.一个是您的网站允许以某种方式注入HTML的地方.这并不难以防范:要么逃避所有用户输入数据,要么剥离所有<>标签并支持类似UBB代码的东西.注意:URL可能仍然会让您受到滚动式攻击.
更为阴险的是某些第三方网站包含点击您网站上的网址的IFRAME,SCRIPT或IMG标记等,此网址将使用用户当前对您网站的任何身份验证.因此,您永远不应该采取任何直接行动来回应GET请求.如果您收到尝试执行任何操作的GET请求(更新个人资料,查看购物车等),那么您应该回复一个表单,而该表单又需要接受POST.此表单还应包含跨站点请求伪造令牌,以便没有人可以在设置为使用隐藏字段提交到您的站点的第三方站点上放置表单(同样,以避免伪装攻击).