Asp.net mvc 阻止TagBuilder.MergeAttribute对属性文本进行编码

Asp.net mvc 阻止TagBuilder.MergeAttribute对属性文本进行编码,asp.net-mvc,spam-prevention,tagbuilder,Asp.net Mvc,Spam Prevention,Tagbuilder,我已经创建了一个Html帮助程序,对电子邮件地址进行编码,以防止垃圾邮件。这与MarkdownSharp库在自动生成电子邮件链接时使用的技术相同 问题在于TagBuilder.MergeAttribute对中断链接的属性文本进行编码。是否可以重写此行为或至少以另一种方式指定属性。我知道我可以退回到只使用字符串连接或StringBuilder的方式,但是TabBuilder确实提供了许多好处,例如可以轻松地合并其他HTML属性 /// <summary> /// Cre

我已经创建了一个Html帮助程序,对电子邮件地址进行编码,以防止垃圾邮件。这与MarkdownSharp库在自动生成电子邮件链接时使用的技术相同

问题在于
TagBuilder.MergeAttribute
对中断链接的属性文本进行编码。是否可以重写此行为或至少以另一种方式指定属性。我知道我可以退回到只使用字符串连接或
StringBuilder
的方式,但是
TabBuilder
确实提供了许多好处,例如可以轻松地合并其他HTML属性

    /// <summary>
    /// Creates an encoded email link in the hopes of foiling most SPAM bots
    /// </summary>
    public static IHtmlString EmailLink(this HtmlHelper html, string email, string text = null, object htmlAttributes = null)
    {
        Ensure.Argument.NotNullOrEmpty(email, "email");

        var encodedEmail = EncodeEmailAddress(email);

        var tb = new TagBuilder("a");
        tb.MergeAttribute("href", "mailto:" + encodedEmail);

        tb.InnerHtml = text ?? encodedEmail;

        if (htmlAttributes != null)
        {
            tb.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        }

        return new HtmlString(tb.ToString());
    }

    /// <summary>
    /// encodes email address randomly  
    /// roughly 10% raw, 45% hex, 45% dec 
    /// note that @ is always encoded and : never is
    /// </summary>
    private static string EncodeEmailAddress(string addr)
    {
        var sb = new StringBuilder(addr.Length * 5);
        var rand = new Random();
        int r;
        foreach (char c in addr)
        {
            r = rand.Next(1, 100);
            if ((r > 90 || c == ':') && c != '@')
                sb.Append(c);                         // m
            else if (r < 45)
                sb.AppendFormat("&#x{0:x};", (int)c); // &#x6D
            else
                sb.AppendFormat("&#{0};", (int)c);    // &#109
        }
        return sb.ToString();
    }
//
///创建一个编码的电子邮件链接,希望能阻止大多数垃圾邮件机器人
/// 
公共静态IHtmlString电子邮件链接(此HtmlHelper html,字符串电子邮件,字符串文本=null,对象htmlAttributes=null)
{
确保.Argument.NotNullOrEmpty(电子邮件,“电子邮件”);
var encodedmail=EncodeEmailAddress(电子邮件);
var tb=新标记生成器(“a”);
tb.MergeAttribute(“href”,“mailto:”+encodedEmail);
tb.InnerHtml=text??encodedEmail;
如果(htmlAttributes!=null)
{
合并属性(新的RouteValueDictionary(htmlAttributes));
}
返回新的HtmlString(tb.ToString());
}
/// 
///随机编码电子邮件地址
///大约10%未加工,45%十六进制,45%十二进制
///请注意,@总是被编码的,而:never是
/// 
专用静态字符串编码器电子邮件地址(字符串地址)
{
var sb=新的StringBuilder(添加长度*5);
var rand=new Random();
INTR;
foreach(地址中的字符c)
{
r=下一个随机数(1100);
如果((r>90|c==':')和&c!='@'))
sb.附加(c);//m
否则如果(r<45)
sb.AppendFormat(“&#x{0:x};”,(int)c);/m
其他的
sb.AppendFormat(“&#{0};”,(int)c);/m
}
使某人返回字符串();
}

我不相信你的助手会做任何有意义的事情来帮助减少垃圾邮件。当爬虫使用HTML解析器时,它们看到的是解码的字符串,而不是编码的字符串。这与浏览器本身的逻辑相同。所以他们所需要做的就是去掉mailto:前缀,现在他们有了原始的电子邮件地址


如果您仍希望继续此操作,则必须使用字符串连接。TagBuilder不适用于已编码的输入。如果您这样做,请确保对&、'和“字符进行编码。

当我在浏览器中查看链接源时,我得到的是编码字符串,而不是解码字符串,因此我假设如果爬虫程序未使用解析器,这将是相同的?