我已经阅读了很多关于 SO 的关于 XSS 以及如何处理的帖子。 通常,共识是白名单而不是黑名单,并避免使用正则表达式(太多变体需要处理)。
我正在开发一个 ASP.Net MVC3 应用程序。 我需要能够从用户条目显示 HTML(例如<强>、
- 、
- 等),但我不想要任何 XSS 风险。
我正在通过Nuget使用AntiXSS包。 在我的模型中,我有
[AllowHtml]
public string UserDetails{ get; set; }
在我看来,我把TinyMCE挂在了文本区域。
在我的控制器中,我从视图中获取帖子并对其进行清理:
using Microsoft.Security.Application;
...
string SanitizedDetails = Sanitizer.GetSafeHtmlFragment(model.UserDetails);
我的问题:我做对了吗? 我是否受到大多数 XSS 问题的保护,或者我吠错了树?
您被发布针对某些表格。允许 html 是一个危险的操作,因此您正在尝试尽可能减轻它。你的方法在这里很好。
还有其他选择可以提供帮助,但不幸的是,并非所有内容都已准备好生产。各种浏览器部分支持内容安全策略标头。前任:http://www.w3.org/TR/CSP/
所以你所拥有的是不错的,但如果你想冒险进入内容安全政策,你可以稍微增强一下(一方面)。
如果您有兴趣,我将在这里介绍很多XSS攻击。http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=hack-proofing-dotnet-app
您可能希望在渲染之前(和保存之前)包含额外的清理,以防其他攻击(例如sql注入)将xss代码插入到html中。
当我们在白名单的帮助下使用Sanitizer.GetSafeHtmlFragment(model.UserDetails);
时,它将不允许任何标签通过它执行。例如,当
model.UserDetails = "Testdata `<script>alert('Malicious Code');</script>`"
它是一个注入代码,SafeHtmlFragment方法不允许执行<script>
标记。
model.UserDetails = "Testdata `<a href="www.google.com">Google <a/>`"
这是一个安全的代码,它应该返回文本和谷歌超链接以导航到 google.com。
当model.UseDetails
仅返回测试数据作为其输出时。