HTML кодировать и URL - PullRequest
       18

HTML кодировать и URL

0 голосов
/ 30 октября 2011

У меня есть строка ввода, которая должна быть удалена из HTML-кодов, поэтому я использую стандартную функцию .Net .HtmlEncode () для экранирования всех опасных символов.

Теперь я пытаюсь заменить URL-адреса во входной строке на якоря HREF с помощью регулярного выражения.

Проблема заключается в том, что когда я «связываю» URL-адреса перед вызовом .HtmlEncode ()теги привязки теряются, что логично.Но когда я делаю ссылку AFTER, вызывающую .HtmlEncode (), некоторые URL искажаются из-за того, что в них содержатся опасные символы?

Кажется, это проблема куриного яйца, как решить эту проблему?

Пример:

Строка ввода:

See http://example.com/q=1&x=2

Ожидаемый результат:

See <a href="http://example.com/q=1&x=2">http://example.com/q=1&amp;x=2</a>

Сначала выполняется HtmlEncode, вызывается Linkify после:

See <a href="http://example.com/q=1&amp;x=2">http://example.com/q=1&amp;x=2</a>

Сначала выполняется Linkify, вызывается HtmlEncode после:

See &lt;a href=&quot;http://example.com/q=1&amp;x=2&quot;&gt;http://example.com/q=1&amp;x=2&lt;/a&gt;

Решение, которое я сейчас использую, заключается в вызове .HtmlDecode () для всех совпадений, найденных с помощью регулярного выражения (linkify), но это не на 100% надежно, поскольку действительный URL может теоретически содержать шаблон, такой как &amp;, который будет декодирован, но не должен.

Ответы [ 3 ]

0 голосов
/ 30 октября 2011

Вы должны относиться к обычному тексту и ссылкам по-разному. Итак, сначала разбейте ввод на части:

If you don't believe me that 1 < 2, see http://example.com/q=1&x=2

становится коллекцией с двумя членами:

{ "If you don't believe me that 1 < 2, see ", "http://example.com/q=1&x=2" }

Вы кодируете первый и делаете ссылку из второго, кодируя только текст ссылки:

{
    "If you don't believe me that 1 &lt; 2, see ",
    "<a href=\"http://example.com/q=1&x=2\">http://example.com/q=1&amp;x=2</a>"
}

Затем вы объединяете результаты в окончательный результат.

Но, возможно, было бы лучше, если бы вы использовали библиотеку, созданную для создания HTML. Либо Html Agility Pack , либо ASP.NET, в зависимости от ваших потребностей.

0 голосов
/ 10 ноября 2011

Вы не можете сделать это с заменой регулярных выражений. Вам необходимо запустить атрибут href через код urlencode, а текст ссылки - через код htmlencode.

0 голосов
/ 30 октября 2011

Это похоже на межсайтовую скриптовую атаку, ожидающую своего появления.

Тестовая ссылка на Google.

Большинство подходов, которые я видел, которые преобразуют ввод пользователя в разметку HTML, используют для этого некоторую «зарезервированную» пользовательскую последовательность, отличную от HTML, например, приведенная выше ссылка в редакторе Stack Overflow выглядит примерно так: 1007 *

[Test link to google.][1]    

  [1]: http://www.google.com

Другие богатые интерфейсы пользовательского интерфейса делают нечто подобное. Это не HTML, но анализируется и позже выводится как HTML. Я не уверен, что этот подход будет работать в вашем случае, но это может быть полезно. Как правило, вы не хотите давать кому-то возможность вводить необработанный HTML-код в ваше приложение, если только вы ему не доверяете (и, поскольку вы используете HtmlEncoding для некоторых из них, похоже, что вы им не доверяете).

...