【问题标题】:Escape text for HTMLHTML 的转义文本
【发布时间】:2010-11-03 13:34:14
【问题描述】:

如何在 C# 中转义文本以供 html 使用?我想做

sample="<span>blah<span>"

并且拥有

<span>blah<span>

仅使用 html 的标签部分显示为纯文本而不是blah :(。 使用 C# 而不是 ASP

【问题讨论】:

    标签: c# html escaping


    【解决方案1】:

    对于在 Razor 页面中执行此操作的简单方法,请使用以下方法:

    在 .cshtml 中:

    @Html.Raw(Html.Encode("<span>blah<span>"))
    

    在 .cshtml.cs 中:

    string rawHtml = Html.Raw(Html.Encode("<span>blah<span>"));
    

    【讨论】:

      【解决方案2】:

      有些特殊引号字符不会被 HtmlEncode 删除,并且不会在 Edge 或 Internet Explorer 中正确显示,例如 。您可以使用以下函数扩展替换这些字符。

      private string RemoveJunkChars(string input)
      {
          return HttpUtility.HtmlEncode(input.Replace("”", "\"").Replace("“", "\""));
      }
      

      【讨论】:

      • 您可能使用了错误的编码来提供内容。 IE 和 Edge 显示这些字符没有问题。
      【解决方案3】:

      你可以使用:

      System.Web.HttpUtility.JavaScriptStringEncode("Hello, this is Satan's Site")
      

      在处理这样的 HTML 时,这是唯一有效的方法(ASP.NET 4.0+)。 &amp;apos; 在 HTML 内容中被渲染为 '(使用 htmldecode),导致它失败:

      <a href="article.aspx?id=268" onclick="tabs.open('modules/xxx/id/268', 'It&apos;s Allstars'); return false;">It's Allstars</a>
      

      【讨论】:

      • Re "htmlencode":你的意思是"HtmlEncode"吗?
      【解决方案4】:

      在 ASP.NET 4.0 中有新的语法可以做到这一点。而不是

      <%= HttpUtility.HtmlEncode(unencoded) %>
      

      你可以这样做

      <%: unencoded %>
      

      在这里阅读更多:

      New <%: %> Syntax for HTML Encoding Output in ASP.NET 4 (and ASP.NET MVC 2)

      【讨论】:

      • 请给出 Razor 的语法? @Nacht
      【解决方案5】:

      此外,如果您不想使用 System.Web 程序集,也可以使用它:

      var encoded = System.Security.SecurityElement.Escape(unencoded)
      

      根据this articleSystem.Security.SecurityElement.Escape()System.Web.HttpUtility.HtmlEncode() 之间的区别在于前者还编码撇号(') 字符。

      【讨论】:

      • 更不用说 SecurityElement.Escape() 转义为 XML 这不完全是 HTML。
      • Windows 商店应用中不存在 System.Security.SecurityElement
      • 请注意,System.Security.SecurityElement.Escape 不会删除或转义字符 31,它曾从活动目录数据的提取中命中我们一次
      【解决方案6】:

      .NET 4.0 及以上版本:

      using System.Web.Security.AntiXss;
      //...
      var encoded = AntiXssEncoder.HtmlEncode("input", useNamedEntities: true);
      

      【讨论】:

        【解决方案7】:

        如果您使用的是 .NET 4 或更高版本并且不想引用 System.Web,则可以使用来自 SystemWebUtility.HtmlEncode

        var encoded = WebUtility.HtmlEncode(unencoded);
        

        这与HttpUtility.HtmlEncode 的效果相同,应该优先于System.Security.SecurityElement.Escape

        【讨论】:

        • 为什么应该优先于 SecurityElement.Escape?后者是否存在漏洞,还是前者更有能力?
        • @Travis 两者都没有漏洞,只是SecurityElement.Escape对XML进行操作,HtmlEncode对HTML进行操作,XML和HTML编码要求略有不同(详见this answer )。因此,例如,SecurityElement.Escape 允许使用 &amp;apos;,而 HtmlEncode 则不允许。
        • @Travis 我认为更好的“借口”是 System.Net 可用于可移植类库,而其他两个选项不是/似乎没有今天早上。 ;^)
        【解决方案8】:

        您可以使用实际的html标签&lt;xmp&gt;&lt;/xmp&gt;来输出字符串,以显示xmp标签之间的所有标签。

        或者你也可以在服务器上使用Server.UrlEncodeHttpUtility.HtmlEncode

        【讨论】:

        • 我把问题说得更清楚了。我不希望标签成为 html 的一部分,因为用户可以这样做 并破坏它。
        • 伟大的帖子感谢这个人,这正是我正在寻找的东西!
        • &lt;xmp&gt; 早已被弃用:stackoverflow.com/questions/8307846/… 改用&lt;pre&gt;
        【解决方案9】:
        using System.Web;
        
        var encoded = HttpUtility.HtmlEncode(unencoded);
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-21
        • 2018-01-17
        • 2013-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多