Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET MVC中仅解码某些HTML标记_C#_Html_Asp.net_Asp.net Mvc_Validation - Fatal编程技术网

C# 在ASP.NET MVC中仅解码某些HTML标记

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净化器,但我还没有找到任何

我正在使用ASP.NETMVC5应用程序。我必须输出用户以某种格式输入的HTML。我将HTML按原样存储在数据库中,也就是说,不按建议进行编码,但在显示之前,我使用MS AntiXSS库对其进行编码。但是,我必须将一些标记输出为HTML,例如,将文本设置为粗体或斜体。在保护应用程序免受XSS攻击的同时,最好的方法是什么?我的想法是首先使用AntiXssEncoder对文本进行编码,然后使用RegExp将允许的标记替换为常用字符。我知道有些工具是为它而存在的,比如HTML净化器,但我还没有找到任何适合ASP的工具

更新: 我决定用类似的东西

    private static readonly Dictionary<string, string> allowedTags = new Dictionary<string, string>()
    {
        {"&lt;p&gt;", "<p>"},
        {"&lt;/p&gt;", "</p>"},
        {"&lt;strong&gt;", "<strong>"},
        {"&lt;/strong&gt;", "</strong>"},
        {"&lt;em&gt;", "<em>"},
        {"&lt;/em&gt;", "</em>"},
        {"&amp;nbsp;", " "},
        {"&#13;&#10;", "<br>"}
    };
尽管我非常不喜欢这个解决方案,因为它缺乏灵活性,我必须手动将每个标记插入字典。此外,它不支持属性,例如,

必须是单独的值。我想我可以像这样替换标签的第一部分

text.Replace("&lt;p", "<p"); 

text.Replace(“p”),“您可以在保存之前解析输入,并尽早删除不允许的元素。最好使用允许标记的白名单(黑名单可能相当大)。您可以使用正则表达式,但请记住它可能不是防弹的。我不能只是删除它们,因为它可能是文本的一个元素;例如,一位作者想编写一些HTML。我可以为它设置一个代码标记,并清理除此标记内的内容以外的所有内容,但我担心这将过于复杂,目前无法实现。当然可以作为文本的一部分,这一点都不好,但除此之外,您应该有一个严格的策略,规定哪些元素是允许的(
(有或没有内联样式),哪些元素是不允许的(例如
元素)。是的,我目前的解决方案可以。Microsoft AntiXssEncoder类已经过滤了所有可能类似HTML标记的内容,因此在过滤后,我将允许的标记转换回HTML,以便它们可以显示为HTML。不过,我仍然不太满意这种方法。填充属性不是标记。如果正确预处理输入以删除whitespace/scrub/etc然后你就可以按原样使用当前的替换算法,并将其按存储方式写出来。我会在POST not GET上做所有的工作。因为你可能会得到比你POST多得多的结果,对吗?
text.Replace("&lt;p", "<p");