我正在阅读一些问题,试图找到一个很好的解决方案,以防止用户提供的url中的XSS(它变成了一个链接)。我找到了一个PHP的,但似乎找不到任何。net的。
要清楚,所有我想要的是一个库,它将使用户提供的文本安全(包括unicode漏洞?),并使用户提供的url安全(用于a
或img
标签)
我注意到StackOverflow有非常好的XSS保护,但遗憾的是,MarkdownSharp似乎缺少了Markdown实现的一部分。(我对很多内容都使用了锐利标记)
微软有反跨站脚本库;你可以先看一看,看看它是否符合你的需求。他们还提供了一些关于如何避免XSS攻击的指导,如果您确定他们提供的工具不是您真正需要的,您可以遵循这些指导。
这里有几件事需要考虑。首先,你有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有编码器。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/<script>
-但是当然请求验证将首先捕获那个字符串。
还可以看看OWASP十大未经验证的重定向和转发。
我认为你可以自己创建一个字符数组和另一个数组的代码,
如果您从数组中找到字符,将其替换为代码,这将对您有所帮助![但绝对不是100%]
字符数组& lt;
在
…
代码数组,lt;
,gt;
div…
我依赖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你可以玩。
(从自述文件中复制/粘贴)