【问题标题】:Clear raw HTML from malicious data in C#从 C# 中的恶意数据中清除原始 HTML
【发布时间】:2016-05-05 17:28:11
【问题描述】:

我正在编写 ASP.NET MVC 应用程序。一些 HTML 来自用户,一些来自第三方来源。有没有像 HAP(Html Agility Pack)或 Tidy 这样的重型火炮的简单和快速的方法来清理 HTML?

我只需要删除脚本、样式、<object>/<embed>href="javascript:"style=onclick,而且我认为通过 .Remove/.Replace 手动删除它们不是一个好方法使用 StringBuilder。

例如,如果我有下一个输入

<html>
    <style src="http://harmyourpage.com"/>
    <script src="http://killyourdog.com"/>
    <div>
        <a href="http://co.com">Good link</a>
        <a href="javascript::harm()">Bad link</a>
        <p>Some text <b>to</b> test</p><br/>
        <h1 style="position:absolute;">Damage your layout</h1>
        And an image there <img src="http://co.com/a.jpg"/><br>
        <span onclick="harm()">Good span with bad attribute</span>
        <object>Your lovely java can be there</object>
    </div>
</html>

必须转换成next:

<div>
    <a href="http://co.com">Good link</a>
    <a>Bad link</a>
    <p>Some text <b>to</b> test</p><br/>
    <h1>Damage your layout</h1>
    And an image there <img src="http://co.com/a.jpg"/><br>
    <span>Good span with bad attribute</span>
</div>

那么,如何以正确的方式使用标签和属性白名单?

UPD:我尝试了 StackExchange HtmlHelpers 库,但它删除了所需的标签,例如 divaimg

【问题讨论】:

  • 为什么在任何情况下都允许来自用户输入的 HTML?
  • 您可能希望禁止最终用户的 HTML 输入,并使用降价语言或某种编码,而不仅仅是原始输入。

标签: c# asp.net-mvc xss


【解决方案1】:

最快的方法是使用正则表达式

var regex = new Regex(
   "(\\<script(.+?)\\</script\\>)|(\\<style(.+?)\\</style\\>)|(\\<object(.+?)\\</object\\>)", 
   RegexOptions.Singleline | RegexOptions.IgnoreCase
);

string ouput = regex.Replace(input, "");

您也可以使用 Microsoft Web 保护库 (http://wpl.codeplex.com/) 进行类似的操作

Sanitizer.GetSafeHtmlFragment(input);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多