【问题标题】:Wrapping to anchor tag without html injection 2.5 M在没有 html 注入的情况下包装到锚标记 2.5 M
【发布时间】:2012-01-10 12:44:18
【问题描述】:

如何防止代码中的 html 注入问题。

我有将字符串中的所有超链接包装到锚点的功能。所以我有这个

@Html.Raw(Helpers.UtilHelpers.ReplaceLinks(Model.Texts[index].Content))

如果没有这个危险的技巧,我怎么能做到这一点?因为这样用户就可以进行html注入了。

我的函数 ReplaceLinks 将所有超链接(如 http://www.google.com)替换为 <a href="google.com">http://www.google.com</a>,因此我想将此行显示为超链接而不是文本。但我想只显示我的函数生成的标签。

【问题讨论】:

    标签: c# html asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    使用 Server.HtmlEncode:http://msdn.microsoft.com/en-us/library/ms525347(v=vs.90).aspx

    如果文本包含 html,它将显示为编码。

    编辑:作为助手添加(扩展方法)

    public static class HtmlUrlExtension
    {
        public static string RawUrl( this HtmlHelper html, string url )
        {
             return html.Raw(HttpServerUtility.HtmlEncode(url));
        }
    }
    

    并使用它:

    @Html.RawUrl(Model.Texts[index].Content)
    

    【讨论】:

    • 这是 html 编码文本的最后一行。那应该工作得很好。 @Html.Raw(HttpServerUtility.HtmlEncode(Model.Texts[index].Content))
    • 你也可以把它当做扩展方法
    【解决方案2】:

    您可以使用AntiXSS 库,它允许您过滤危险的标签和脚本,并安全地显示用户输入的 HTML 字符串,而无需对其进行编码。

    【讨论】:

    • 不幸的是,我的函数 ReplaceLinks 将所有超链接(如 google.com)替换为 google.com">http://www.google.com</a>,所以我想将此行显示为超链接而不是文本。但我想显示为这只是我的函数生成的标签。
    • @mesiesta,你可以用你的函数做你喜欢的替换,一旦你准备好用@Html.Raw输出,将结果传递给AntiXss以确保没有危险的标签。
    【解决方案3】:

    在你的替换函数中添加一个自定义 CSS 类的跨度,然后用它来设置你的链接

    <span class="myLinkClass" url-data="......">fooo</span>
    

    通过这种方式,只有您的链接将由以下 jQuery 魔术管理。

    要访问你所有的假 &lt;a href /&gt;,你可以使用一个简单的 jQuery 选择器(用于客户端的东西)

    $("span.myLinkClass").each(new function() { 
       $(this).click(function () {
          location.href = $(this).attr("url-data");
       });
    });
    

    当然你也可以用它来设计风格

    .myLinkClass { color: yellow; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多