Какой мой лучший выбор для замены простых текстовых ссылок на теги привязки в строке? .СЕТЬ - PullRequest
0 голосов
/ 10 мая 2010

Какой мой лучший вариант для преобразования простых текстовых ссылок внутри строки в теги привязки?

Скажем, например, у меня "Я пошел и искал на http://www.google.com/ сегодня". Я хотел бы изменить это на "Я пошел и искал на http://www.google.com/ сегодня".

Метод должен быть защищен от любого вида атаки XSS, так как строки генерируются пользователем. Они будут безопасны перед синтаксическим анализом, поэтому мне просто нужно убедиться, что при анализе URL-адресов не возникает никаких уязвимостей.

1 Ответ

1 голос
/ 10 мая 2010

Простое регулярное выражение может получить то, что вы хотите, так как вы говорите, что строки будут безопасны перед анализом. Просто используйте следующий метод.

private static readonly Regex urlRegex = new Regex(@"(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*", RegexOptions.Compiled);
private static readonly Regex emailRegex = new Regex(@"([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})", RegexOptions.Compiled);
private static readonly IEnumerable<string> disallowedProtocols = new[] { "javascript", "ftp" };
private static string ConvertUrls(string s) {
    s = emailRegex.Replace(
            s,
            match => string.Format(CultureInfo.InvariantCulture, "<a href=\"mailto:{0}\" rel=\"nofollow\">{0}</a>", match.Value)
        );

    s = urlRegex.Replace(
            s,
            match => {
                var protocolGroup = match.Groups["Protocol"];
                if (protocolGroup.Success && !disallowedProtocols.Contains(protocolGroup.Value, StringComparer.OrdinalIgnoreCase)) {
                    return string.Format(CultureInfo.InvariantCulture, "<a href=\"{0}\" rel=\"nofollow\">{0}</a>", match.Value);
                } else {
                    return match.Value;
                }
            }
        );

    return s;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...