C# 在ASP.NET MVC中仅解码某些HTML标记
我正在使用ASP.NETMVC5应用程序。我必须输出用户以某种格式输入的HTML。我将HTML按原样存储在数据库中,也就是说,不按建议进行编码,但在显示之前,我使用MS AntiXSS库对其进行编码。但是,我必须将一些标记输出为HTML,例如,将文本设置为粗体或斜体。在保护应用程序免受XSS攻击的同时,最好的方法是什么?我的想法是首先使用AntiXssEncoder对文本进行编码,然后使用RegExp将允许的标记替换为常用字符。我知道有些工具是为它而存在的,比如HTML净化器,但我还没有找到任何适合ASP的工具 更新: 我决定用类似的东西C# 在ASP.NET MVC中仅解码某些HTML标记,c#,html,asp.net,asp.net-mvc,validation,C#,Html,Asp.net,Asp.net Mvc,Validation,我正在使用ASP.NETMVC5应用程序。我必须输出用户以某种格式输入的HTML。我将HTML按原样存储在数据库中,也就是说,不按建议进行编码,但在显示之前,我使用MS AntiXSS库对其进行编码。但是,我必须将一些标记输出为HTML,例如,将文本设置为粗体或斜体。在保护应用程序免受XSS攻击的同时,最好的方法是什么?我的想法是首先使用AntiXssEncoder对文本进行编码,然后使用RegExp将允许的标记替换为常用字符。我知道有些工具是为它而存在的,比如HTML净化器,但我还没有找到任何
private static readonly Dictionary<string, string> allowedTags = new Dictionary<string, string>()
{
{"<p>", "<p>"},
{"</p>", "</p>"},
{"<strong>", "<strong>"},
{"</strong>", "</strong>"},
{"<em>", "<em>"},
{"</em>", "</em>"},
{"&nbsp;", " "},
{" ", "<br>"}
};
尽管我非常不喜欢这个解决方案,因为它缺乏灵活性,我必须手动将每个标记插入字典。此外,它不支持属性,例如,必须是单独的值。我想我可以像这样替换标签的第一部分
text.Replace("<p", "<p");
text.Replace(“p”),“您可以在保存之前解析输入,并尽早删除不允许的元素。最好使用允许标记的白名单(黑名单可能相当大)。您可以使用正则表达式,但请记住它可能不是防弹的。我不能只是删除它们,因为它可能是文本的一个元素;例如,一位作者想编写一些HTML。我可以为它设置一个代码标记,并清理除此标记内的内容以外的所有内容,但我担心这将过于复杂,目前无法实现。当然可以作为文本的一部分,这一点都不好,但除此之外,您应该有一个严格的策略,规定哪些元素是允许的(,
(有或没有内联样式),哪些元素是不允许的(例如
元素)。是的,我目前的解决方案可以。Microsoft AntiXssEncoder类已经过滤了所有可能类似HTML标记的内容,因此在过滤后,我将允许的标记转换回HTML,以便它们可以显示为HTML。不过,我仍然不太满意这种方法。填充属性不是标记。如果正确预处理输入以删除whitespace/scrub/etc然后你就可以按原样使用当前的替换算法,并将其按存储方式写出来。我会在POST not GET上做所有的工作。因为你可能会得到比你POST多得多的结果,对吗?
text.Replace("<p", "<p");