1

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

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

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

4

4 回答 4

6

微软有反跨站脚本库;您可以先查看它并确定它是否符合您的需求。他们还提供了一些关于如何避免 XSS 攻击的指导,如果您确定他们提供的工具不是您真正需要的,您可以遵循这些指导。

于 2011-04-21T04:34:56.353 回答
2

这里有几件事需要考虑。首先,您有ASP.NET 请求验证,它将捕获许多常见的 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 的字符串,即在查询字符串中。问题是您想要获取原始字符串而不是转义字符,例如正斜杠,否则http://troyhunt.com最终http%3a%2f%2ftroyhunt.com会出现问题。

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

MyHyperlink.NavigateUrl = Encoder.HtmlAttributeEncode(sourceUri);

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

另请查看 OWASP Top 10 Unvalidated Redirects and Forwards

于 2011-04-22T08:15:00.673 回答
0

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

字符数组
<
>
...

代码数组
<
>
...

于 2011-04-21T04:30:48.320 回答
0

我依靠HtmlSanitizer。它是一个 .NET 库,用于从可能导致XSS 攻击的构造中清除 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>"));

有一个在线演示,还有一个可以玩的.NET Fiddle 。

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

于 2017-04-28T09:51:51.400 回答