【问题标题】:Are there any anti-XSS libraries for ASP.Net?ASP.Net 是否有任何反 XSS 库?
【发布时间】:2011-04-21 04:26:11
【问题描述】:

我正在阅读一些问题,试图找到一个好的解决方案来防止用户提供的 URL(变成链接)中的 XSS。我找到了one for PHP,但我似乎无法为.Net 找到任何东西。

明确地说,我想要的只是一个库,它将使用户提供的文本安全(包括 unicode 陷阱?)并使用户提供的 URL 安全(用于 aimg 标签)

我注意到 StackOverflow 具有非常好的 XSS 保护,但遗憾的是,MarkdownSharp 似乎缺少他们的 Markdown 实现部分。 (我的很多内容都使用 MarkdownSharp)

【问题讨论】:

    标签: asp.net security xss markdown antixsslibrary


    【解决方案1】:

    微软有Anti-Cross Site Scripting Library;您可以先查看它并确定它是否符合您的需求。他们也有some guidance,告诉您如何避免 XSS 攻击,如果您确定他们提供的工具不是您真正需要的,您可以遵循这些攻击。

    【讨论】:

    【解决方案2】:

    这里有几件事情需要考虑。首先,您有ASP.NET Request Validation,它将捕获许多常见的 XSS 模式。不要只依赖它,但它是一个不错的小附加值。

    接下来您要根据白名单验证输入,在这种情况下,您的白名单就是要符合 URL 的预期结构。尝试使用 Uri.IsWellFormedUriString 来遵守 RFC 2396 和 RFC 273:

    var sourceUri = UriTextBox.Text;
    if (!Uri.IsWellFormedUriString(sourceUri, UriKind.Absolute))
    {
      // Not a valid URI - bail out here
    }
    

    AntiXSS 具有 Encoder.UrlEncode,它非常适合编码要附加到 URL 的字符串,即在查询字符串中。问题是您想要获取原始字符串并且 not 转义字符(例如正斜杠),否则 http://troyhunt.com 会以 http%3a%2f%2ftroyhunt.com 结尾,您就有问题了。

    由于您要编码的上下文是一个 HTML 属性(它是您设置的“href”属性),您想使用 Encoder.HtmlAttributeEncode:

    MyHyperlink.NavigateUrl = Encoder.HtmlAttributeEncode(sourceUri);
    

    这意味着像http://troyhunt.com/<script> 这样的字符串将被转义到http://troyhunt.com/<script> - 但当然,请求验证无论如何都会先捕获那个字符串。

    还可以查看 OWASP Top 10 Unvalidated Redirects and Forwards

    【讨论】:

    • AntiXSS 将在周末推出 EncodeUrlPath 测试版 :) 但是是的,不幸的是,UrlEncode 并没有做到它的名字。我对此无能为力 - 它做了框架函数的作用:)
    【解决方案3】:

    我认为您可以通过创建一个字符数组和另一个包含代码的数组来自己完成,
    如果您发现数组中的字符将其替换为代码,这将对您有所帮助! [但绝对不是 100%]

    字符数组
    >
    ...

    代码数组


    >
    ...

    【讨论】:

    • 好吧,我知道我可以自己制作,但我宁愿使用其他人的,因为我对 XSS 的了解并不多,而且我不想冒险在自己的项目中存在漏洞制作
    【解决方案4】:

    我依赖HtmlSanitizer。它是一个 .NET 库,用于从可能导致 XSS attacks 的构造中清除 HTML 片段和文档。 它使用AngleSharp 来解析、操作和呈现 HTML 和 CSS。

    由于 HtmlSanitizer 基于强大的 HTML 解析器,它还可以保护您免受故意或意外的影响 “标签中毒”,其中一个片段中的无效 HTML 会破坏整个文档,导致布局或样式损坏。

    用法:

    var sanitizer = new HtmlSanitizer();
    var html = @"<script>alert('xss')</script><div onload=""alert('xss')"""
        + @"style=""background-color: test"">Test<img src=""test.gif"""
        + @"style=""background-image: url(javascript:alert('xss')); margin: 10px""></div>";
    var sanitized = sanitizer.Sanitize(html, "http://www.example.com");
    Assert.That(sanitized, Is.EqualTo(@"<div style=""background-color: test"">"
        + @"Test<img style=""margin: 10px"" src=""http://www.example.com/test.gif""></div>"));
    

    有一个online demo,还有一个.NET Fiddle可以玩。

    (从他们的自述文件中复制/粘贴)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 2022-09-22
      相关资源
      最近更新 更多