gpt4 book ai didi

asp.net-mvc - 防止 TagBuilder.MergeAttribute 对属性文本进行编码

转载 作者:行者123 更新时间:2023-12-03 01:34:19 26 4
gpt4 key购买 nike

我创建了一个 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();
}

最佳答案

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

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

关于asp.net-mvc - 防止 TagBuilder.MergeAttribute 对属性文本进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15302765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com