Запрет TagBuilder.MergeAttribute из текста атрибута кодирования
Я создал 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); // m
else
sb.AppendFormat("&#{0};", (int)c); // m
}
return sb.ToString();
}
1 ответ
Я не верю, что ваш помощник сделает что-то значимое, чтобы помочь уменьшить спам. Когда сканеры используют анализаторы HTML, они видят декодированные строки, а не закодированные. Это та же логика, что и в самом браузере. Поэтому все, что им нужно сделать, это удалить префикс mailto:, и теперь у них есть оригинальный адрес электронной почты.
Если вы все еще хотите заниматься этим, вы должны использовать конкатенацию строк. TagBuilder не предназначен для работы с уже закодированным вводом. Если вы идете по этому пути, убедитесь, что вы кодируете символы &, 'и'.