TinyMCE,AntiXSS,MVC3和GetSafeHtmlFragment

时间:2012-06-04 01:39:33

标签: asp.net asp.net-mvc-3 tinymce xss antixsslibrary

我已经阅读了很多关于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问题的保护,还是我咆哮了错误的树?

2 个答案:

答案 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 作为输出时。