为什么未使用Microsoft AntiXSS清除未关闭的html标记?
string untrustedHtml = "<img src=x onmouseover=confirm(foo) y=";
string trustedHtml = AntiXSS.Sanitizer.GetSafeHtmlFragment(untrustedHtml); // returns "<img src=x onmouseover=confirm(foo) y="
清理关闭标签:
string untrustedHtml = "<img src=x onmouseover=confirm(foo) y=a>";
string trustedHtml = AntiXSS.Sanitizer.GetSafeHtmlFragment(untrustedHtml); // returns ""
答案 0 :(得分:1)
建议尽可能使用HTML编码而不是HTML卫生。 只有在您确实需要使用某些HTML但希望删除任何不安全的代码时,才应使用卫生设施。 99%的时间你不需要用户插入任何HTML,并且应该通过编码来消除这种情况。
话虽如此,如果你仍然想要进行卫生,AntiXSS不是最好的解决方案 - 因为上面的例子,以及它也删除了完全安全的HTML并错误地将其识别为不安全的事实,导致AntiXSS清洁剂无效。 Ajax控件工具包有一个更好的内部清理程序可以使用,但请注意它的安全性较低,因为它们部分使用黑名单(搜索危险代码而不是只允许安全代码)。
如果您仍想使用AntiXSS卫生设施,则可以在发送到清洁消毒器之前检查插入的HTML是否有效。例如,您可以使用某种XML文档类,因为任何有效的HTML也是有效的XML。
希望这有帮助。
答案 1 :(得分:1)
您使用的是什么版本的AntiXss库?
我使用的是4.3.0.0版,当我通过Encoder.GetSafeHtmlFragment()
运行时并且输出给出以下值&#34;&lt; img src = x onmouseover = test(1)y =&#34; 如您所见,它们会自动编码非HTML值。
以下是我使用的代码:
protected void Page_Load(object sender, EventArgs e)
{
var testValue = "<img src=x onmouseover=test(1) y=";
litFirst.Text = testValue;
litSecond.Text = Sanitizer.GetSafeHtml(testValue);
litThird.Text = Sanitizer.GetSafeHtmlFragment(testValue);
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script>
function test(x) {
alert(x);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
First: <asp:Literal ID="litFirst" runat="server"/>
<br/>
Second: <asp:Literal ID="litSecond" runat="server"/>
<br/>
Third: <asp:Literal ID="litThird" runat="server"/>
</div>
</form>
</body>
</html>
但我也同意Gil Cohen,因为你真的不应该允许用户输入HTML。
与Gil Cohen一起,我建议不要让他们直接输入HTML,而是通过Markup,Textile,Wiki标记之类的中间语言来完成,仅举几例。这样做的好处是允许用户对输出进行更多控制,但仍然不允许用户直接编写HTML。
有JavaScript WYSIWYG编辑器将为用户输出标记/预览,然后允许您保存标记语言供以后使用(在输出过程中转换为HTML,而不是在将其保存到数据之前)存储)。