下面的代码不会捕获什么危险的例子?
编辑:在一些评论后,我添加了另一行,评论如下.请参阅Vinko在David Grant的回答中的评论.到目前为止,只有Vinko回答了这个问题,该问题要求具体的例子可以通过这个功能. Vinko提供了一个,但我编辑了代码来关闭那个洞.如果你们中的另一个人能够想到另一个具体的例子,那么你们将得到我的投票!
public static string strip_dangerous_tags(string text_with_tags) { string s = Regex.Replace(text_with_tags,@"<script","<scrSAFEipt",RegexOptions.IgnoreCase); s = Regex.Replace(s,@"</script","</scrSAFEipt",@"<object","</objSAFEct",@"</object","</obSAFEct",RegexOptions.IgnoreCase); // ADDED AFTER THIS QUESTION WAS POSTED s = Regex.Replace(s,@"javascript","javaSAFEscript",RegexOptions.IgnoreCase); s = Regex.Replace(s,@"onabort","onSAFEabort",@"onblur","onSAFEblur",@"onchange","onSAFEchange",@"onclick","onSAFEclick",@"ondblclick","onSAFEdblclick",@"onerror","onSAFEerror",@"onfocus","onSAFEfocus",@"onkeydown","onSAFEkeydown",@"onkeypress","onSAFEkeypress",@"onkeyup","onSAFEkeyup",@"onload","onSAFEload",@"onmousedown","onSAFEmousedown",@"onmousemove","onSAFEmousemove",@"onmouSEOut","onSAFEmouSEOut",@"onmouseup","onSAFEmouseup",@"onreset","onSAFEresetK",@"onresize","onSAFEresize",@"onselect","onSAFEselect",@"onsubmit","onSAFEsubmit",@"onunload","onSAFEunload",RegexOptions.IgnoreCase); return s; }
它永远不够 – 白名单,不要黑名单
例如javascript:伪URL可以使用HTML实体进行模糊处理,您已经忘记了< embed>并且在IE中存在危险的CSS属性,如行为和表达.
有7000个逃避过滤器,这种方法必将失败.即使您今天发现并阻止了所有可能的漏洞利用,未来也可能会添加新的不安全元素和属性.
保护HTML只有两种好方法:
>通过替换每个<将其转换为文本与& lt;.
如果您想允许用户输入格式化文本,您可以使用自己的标记(例如像SO那样的降价).
>将HTML解析为DOM,检查每个元素和属性,并删除未列入白名单的所有内容.
您还需要检查允许的属性(如href)的内容(确保URL使用安全协议,阻止所有未知协议).
一旦清理了DOM,就可以从中生成新的有效HTML.永远不要像在文本上那样处理HTML,因为无效的标记,注释,实体等很容易欺骗你的过滤器.