【发布时间】:2011-08-07 21:54:49
【问题描述】:
我正在尝试编写一个安全且轻量级的基于白名单的 HTML 净化器,它将使用 DOMDocument。为了避免不必要的复杂性,我愿意做出以下妥协:
- HTML cmets 被移除
-
script和style标记一起被剥离 - 只会返回
body标签的子节点 - 所有可以触发 Javascript 事件的 HTML 属性都将被验证或删除
我已经阅读了很多关于 XSS 攻击和预防的内容,我希望我不会太天真(如果我是,请告诉我!)假设我遵守了上面提到的所有规则,我不会受到 XSS 的伤害。
问题是我不确定除了default Javascript event attributes之外还有哪些其他标签和属性(在任何[X]HTML版本和/或浏览器版本/实现中)可以触发Javascript事件:
onAbortonBluronChangeonClickonDblClickonDragDroponErroronFocusonKeyDownonKeyPressonKeyUponLoadonMouseDownonMouseMoveonMouseOutonMouseOveronMouseUponMoveonResetonResizeonSelectonSubmitonUnload
是否有任何其他非默认或专有事件属性可以触发 Javascript(或 VBScript 等)事件或代码执行?我可以想到href、style和action,比如:
<a href="javascript:alert(document.location);">XSS</a> // or
<b style="width: expression(alert(document.location));">XSS</b> // or
<form action="javascript:alert(document.location);"><input type="submit" /></form>
我可能会删除 HTML 标记中的所有 style 属性,action 和 href 属性提出了更大的挑战,但我认为以下代码足以确保它们的值是相对值或绝对值URL 而不是一些讨厌的 Javascript 代码:
$value = $attribute->value;
if ((strpos($value, ':') !== false) && (preg_match('~^(?:(?:s?f|ht)tps?|mailto):~i', $value) == 0))
{
$node->removeAttributeNode($attribute);
}
所以,我的两个明显问题是:
- 我是否缺少任何可以触发事件的标签或属性?
- 是否存在这些规则未涵盖的攻击媒介?
经过大量测试、思考和研究,我想出了following (rather simple) implementation,它似乎对我可以扔给它的任何 XSS 攻击向量免疫。
非常感谢您提供的所有宝贵答案,谢谢。
【问题讨论】:
-
如果浏览器支持
http:jascript:alert(...等格式错误的 url,您对 URI 的检查可能会被愚弄。 -
好吧,javascript 的评估有很多可能的变化,比如编码和解码。 eval,外部 javascript 文件等等......基本上,没有已知的方法可以防止用户做坏事。您可以尝试转义标签、单词、引号,但仍然可以通过有趣的方法注入 xss。对于这个问题,我建议阅读WhiteHat security,也许你能找到有用的东西?
-
这听起来不像“基于白名单”。基于白名单的方法是只复制您知道是无害的标签和属性。你不需要一个harm_ful_属性列表。
-
@hakre:只要不执行 Javascript,我真的不在乎链接是否损坏。从我有限的测试(我没有过多的操作系统、浏览器)来看,sn-p(和其他一些变体)不起作用。
-
@Henning:我应该说得更清楚...标签必须始终列入白名单(
script和style将始终被删除)。标签属性可以列入白名单,也可以不列入(允许所有属性,应内部清理或列入黑名单)。如果您允许a标签,您可能还需要允许href属性并且您仍然遇到同样的问题 - 这就是为什么我采用第二遍黑名单方法,因为将所有可能的标签属性列入白名单值会过于繁琐且极易出现人为错误。
标签: php javascript html security xss