AntiXSS不会对未关闭的html标记进行清理

时间:2015-02-02 10:55:08

标签: c# asp.net xss

为什么未使用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 ""

2 个答案:

答案 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,而不是在将其保存到数据之前)存储)。