我正在尝试编写一个安全且轻量级的基于白名单的HTML净化器,它将使用DOMDocument.为了避免不必要的复杂性,我愿意做出以下妥协:
HTML评论已删除
script
和style
标签一起被剥离
只body
返回标记的子节点
可以触发Javascript事件的所有HTML属性都将被验证或删除
我一直在阅读关于XSS攻击和预防的很多内容,我希望我不是太天真(如果我,请让我知道!)假设如果我遵循上面提到的所有规则,我将会从XSS安全.
问题是除了默认的Javascript事件属性之外,我不确定其他标签和属性(在任何[X] HTML版本和/或浏览器版本/实现中)可以触发Javascript事件:
onAbort
onBlur
onChange
onClick
onDblClick
onDragDrop
onError
onFocus
onKeyDown
onKeyPress
onKeyUp
onLoad
onMouseDown
onMouseMove
onMouseOut
onMouseOver
onMouseUp
onMove
onReset
onResize
onSelect
onSubmit
onUnload
是否有任何其他非默认或专有事件属性可以触发Javascript(或VBScript等)事件或代码执行?我能想到的href
,style
并且action
,例如:
XSS // or XSS // or
我可能只是删除style
HTML标记中的任何属性,action
并且href
属性构成了更大的挑战,但我认为以下代码足以确保它们的值是相对或绝对URL而不是一些讨厌的Javascript代码:
$value = $attribute->value; if ((strpos($value, ':') !== false) && (preg_match('~^(?:(?:s?f|ht)tps?|mailto):~i', $value) == 0)) { $node->removeAttributeNode($attribute); }
所以,我的两个显而易见的问题是:
我错过了任何可以触发事件的标签或属性吗?
是否存在这些规则未涵盖的攻击媒介?
经过大量的测试,思考和研究后,我提出了以下(相当简单的)实现,它似乎对我可以抛出的任何XSS攻击向量免疫.
我非常感谢您所有有价值的答案,谢谢.
你提到href
并action
作为地方javascript:
的URL可以显示,但你错过了src
一堆其他的URL加载属性之间的属性.
OWASP Java HTMLPolicyBuilder的第399行是白名单HTML清理程序中URL属性的定义.
private static final SetURL_ATTRIBUTE_NAMES = ImmutableSet.of( "action", "archive", "background", "cite", "classid", "codebase", "data", "dsync", "formaction", "href", "icon", "longdesc", "manifest", "poster", "profile", "src", "usemap");
在HTML5指数包含的属性类型的摘要.它没有提到一些有条件的事情,但如果你扫描该列表中的有效URL和朋友,你应该对HTML5添加的内容有所了解.具有类型的HTML 4属性集
%URI
也是提供信息的.
您的协议白名单看起来非常类似于OWASP清洁剂.添加ftp
并且sftp
看起来非常无害.
HTML元素和属性的安全相关模式信息的良好来源是Caja JS HTML清理程序使用的Caja JSON白名单.
您打算如何渲染生成的DOM?如果你不小心,那么即使你删除所有元素,攻击者也可能会得到一个错误的渲染器来生成浏览器解释为包含
元素的内容.考虑不包含脚本元素的有效HTML.
有错误的渲染器可能会将其内容输出为:
它包含一个脚本元素.
(完全披露:我写了上面提到的两种HTML消毒剂的块.)