我已经阅读了很多关于XSS以及如何处理的帖子。通常,共识是黑名单上的白名单,并避免使用正则表达式(太多的变体来处理)。
我正在开发一个ASP.Net MVC3应用程序。我需要能够从用户条目中显示HTML(例如< strong>,< ul>,< li>等等),但我不想要任何XSS风险。
我正在通过Nuget使用AntiXSS软件包。在我的模型中,我有
[AllowHtml]
public string UserDetails{ get; set; }
在我看来,我把TinyMCE挂在了textarea上。
在我的控制器中,我从View中获取帖子并清理它:
using Microsoft.Security.Application;
...
string SanitizedDetails = Sanitizer.GetSafeHtmlFragment(model.UserDetails);
我的问题:我做得对吗?我是否受到大多数XSS问题的保护,还是我咆哮了错误的树?
答案 0 :(得分:4)
您是针对某些表单发布的。允许html是一个危险的操作,所以你试图尽可能地减轻它。你的方法非常好。
还有其他选择可以提供帮助,但遗憾的是并非一切都已准备就绪。 各种浏览器部分支持内容安全策略标头。 例如: http://www.w3.org/TR/CSP/
所以你所拥有的是体面的,但如果你想冒险进入内容安全政策(一个人),你可以稍微增强一点
如果您有兴趣,我会在这里进行一些XSS攻击。 http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=hack-proofing-dotnet-app
您可能希望在渲染之前(以及保存之前)包含额外的清理,以防其他攻击(例如sql注入)将xss代码插入到您的html中。
答案 1 :(得分:0)
当我们在白名单的帮助下使用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超链接以导航到google.com。
当model.UseDetails
仅返回 Testdata 作为输出时。