如何验证HTML输入以防止XSS?

时间:2012-06-23 05:54:45

标签: asp.net-mvc-3

例如,StackExchange将HTML的一个子集列入白名单: https://meta.stackexchange.com/questions/1777/what-html-tags-are-allowed-on-stack-exchange-sites

如何在控制器中执行此操作以确保用户输入安全?

3 个答案:

答案 0 :(得分:2)

这种方法与StackExchange不同,但我发现AntiXSS 4.x库是一种简单的方法来清理输入以允许“安全”的HTML。

http://www.microsoft.com/en-us/download/details.aspx?id=28589您可以在此处下载某个版本,但我将其与有用的DOCX文件相关联。我首选的方法是使用NuGet包管理器来获取最新的AntiXSS包。

您可以使用4.x AntiXss库中的HtmlSanitizationLibrary程序集。请注意,GetSafeHtml()位于Microsoft.Security.Application.Sanitizer下的HtmlSanitizationLibrary中。

content = Sanitizer.GetSafeHtml(userInput);

这可以在保存到数据库之前完成。优点是立即删除恶意内容,而不必在输出时担心它。缺点是它不会处理任何现有的数据库内容,并且您必须在进行数据库更新时随时应用它。

另一种方法是每次输出内容时都使用此方法。

我很想知道首选方法是什么。

答案 1 :(得分:0)

您可以尝试JSoup解析器,它与清理HTML输入一起提供了许多开箱即用的功能。 您可以访问http://jsoup.org/以获取有关JSoup的更多详细信息,并从那里下载二进制文件。 它提供了DOM方法来遍历HTML树并获得所需的元素。

虽然清理HTML生成的代码以防止XSS攻击是一种很好的做法,但我强烈建议通过清理HTML输入来避免使用任何解析器来避免XSS附加。 如果您的HTML树非常大,那么响应时间就会增加多少。在清理HTML树时,您应该确保在FORM中输入的任何用户都是正确的并且符合预期值。

您可以访问www.owasp.org以了解有关如何避免XSS攻击的更多信息。该网站为您提供了可能的备忘单,以确保您的HTML树免受任何XSS攻击。

答案 2 :(得分:0)

ASP.NET HttpUtility.Htmlencode()为您提供。 但是如果你想阻止危险的脚本,首先不要将插入到数据库中。首先,在插入数据库之前清理HTML文本。

我找到了一个为你做的课:http://eksith.wordpress.com/2012/02/13/antixss-4-2-breaks-everything/

它工作正常,您可以将新标签和属性添加到Sanitizer的自定义白名单。

注意:Microsoft Sanitizer和Anti-XSS Library对我没用。也许你也可以尝试一下。