我们如何在asp.net mvc(C#)应用程序中处理javascript注入?
我可以在我的视图中使用Html.Encode.但问题是我有html也在页面中显示像博客文章.
我需要删除在应用程序的输入元素中输入的脚本吗?我怎么能在一个共同的地方做到这一点?
这样做的"高级"最佳实践是:
将用户输入存储为输入系统的方式
HTML在任何页面上输出时对所有用户输入进行编码
使用白名单方法"解码"您在上一步中编码的允许的HTML字符,属性,属性值等
输出上的HTML编码用户输入将阻止JavaScript在您的站点上执行.
您希望将用户输入存储为"已输入"的原因是因为您可能在将来决定输出其他格式(PDF,电子邮件,JavaScript,RSS等)的用户数据,这些格式不具有相同的编码规则.因此,您应该尽可能保持数据尽可能接近原始格式.这将使以后更容易处理.
对于HTML编码用户输入,您可以使用System.Web.HttpUtility.HtmlEncode(...)
.
要结合步骤2和3,您可以使用Microsoft的AntiXSS库.它提供了一些额外的编码方法,HttpUtility类没有提供这些方法来使您的工作更轻松.直到Malcolm在评论中指出,我才意识到这个库的最新版本包含一个方法,该方法GetSafeHtmlFragment(...)
将手动删除所有JavaScript.这将解决为您删除用户输入的JavaScript代码的所有繁重工作.您很可能想要使用 GetSafeHtmlFragment
而不是 GetSafeHtml
,它旨在编码整个HTML文档.
次要注意事项:如果您发现功能无法正常工作,请阅读最新的AntiXss版本(撰写本文时的2012年1月)的评论.您可能需要考虑使用较旧的版本,具体取决于您的需求,但请注意旧版本中存在已知的安全缺陷.微软已经承认了这个问题并正在寻找解决方案.