- HTML注释将被删除 - script和style标签将被完全去除 - 只有body标签的子节点将被返回 - 所有可以触发Javascript事件的HTML属性将被验证或删除
我一直在阅读关于XSS攻击和预防的文章,希望我不会太天真(如果我是,请告诉我!),因为我认为如果我遵循上述所有规则,我将免受XSS攻击的威胁。
问题是我不确定还有哪些标签和属性(在任何[X]HTML版本和/或浏览器版本/实现中)可以触发Javascript事件,除了默认的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
:
<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);
}
所以,我有两个显而易见的问题:
- 我是否遗漏了可以触发事件的标签或属性?
- 是否存在任何攻击向量未被这些规则覆盖?
经过大量测试、思考和研究,我想出了以下(相当简单的)实现方法,它似乎对我能想到的任何XSS攻击向量都是免疫的。
非常感谢您宝贵的回答,谢谢。
http:jascript:alert(...
的格式错误的 URL,那么您检查 URI 的方法可能会被欺骗。 - hakrea
标签为例。你将其列入白名单。显然,它本身并不是很有用,除非你也将其href
属性列入白名单;现在你有一个问题,如何将每个可能的有效和安全(绝对和相对)URL都列入白名单?!如果没有第二次黑名单,我会说那是不可能的。虽然每天都会发现新的攻击向量,但(至少我所见过的)所有攻击都依赖于同样的旧标签和/或属性,可以执行Javascript代码,我打算删除JS特定的内容并清理有用的内容。 - Alix Axel