Заменить HTML-кодами ASCII - PullRequest
       6

Заменить HTML-кодами ASCII

1 голос
/ 02 апреля 2009

Я столкнулся с проблемой. Написал следующий фрагмент кода:

teksti = teksti.Trim()
teksti = Replace(teksti, "<", "& lt;")
teksti = Replace(teksti, ">", "& gt;")
teksti = Replace(teksti, """", "& quot;")
teksti = Replace(teksti, "'", "& #8217;")
teksti = Replace(teksti, "%", "& #37;")
teksti = Replace(teksti, "&", "& amp;")
teksti = Replace(teksti, "#", "& #35;")
teksti = Replace(teksti, "@", "& #64;")

После написания этого я понял, что это становится его собственной проблемой. Предполагается, что функция делает информацию безопасной для внедрения HTML и SQL (есть и другие методы, параметризованные запросы и т. Д., Но это не относится к делу). Однако, что происходит, так это то, что сначала он заменяет &lt; на & lt;, а затем снова заменяет вновь записанную строку, так как каждая строка замены имеет &, # и; знаки в нем.

Есть намеки? Я думал об использовании регулярных выражений для этого, но я не смог найти достойных примеров Visual Basic, которые были бы достаточно простыми.

Редактировать: Спасибо за советы. Я был уверен, что будет «умный» простой способ сделать это, но я думаю, что в конце концов нет общих методов. Перестановка проблемных случаев в первую очередь является очевидным решением, спасибо за это. Я думаю, что рабочий день был слишком длинным, чтобы я мог заметить. : D

Что касается параметризованных запросов, то при проверке я вижу, что мой английский выходит не так, как предполагалось. Я хотел сказать, что я уже использую их, что эта проблема здесь специфическая, чтобы предотвратить всевозможные html-инъекции и возможные sql-инъекции, используя те же строки в другом месте позже. Еще раз спасибо за помощь.

Ответы [ 7 ]

6 голосов
/ 02 апреля 2009

Если это .NET, вместо этого вы можете посмотреть System.Web.HttpServerUtility.HtmlEncode.

Если вы используете VBScript / VB6, просто переместите знак амперсанда и фунта вверх в этот список, и не полагайтесь на эту функцию, чтобы защитить вас от внедрения SQL. Вам все еще нужны параметризованные запросы.

3 голосов
/ 02 апреля 2009

Если вы используете VB.NET, вы ищете System.Web.HttpUtility.HtmlEncode (string) .

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

2 голосов
/ 02 апреля 2009

Сначала замените символ &, затем символ #. После этого другие могут быть безопасно заменены.

Однако это не хороший способ защиты от внедрения SQL. Это предпочтительно сделать с помощью параметризованных запросов. В вашем коде есть символы, которые не нуждаются в кодировке для HTML. Если вы кодируете их для защиты от SQL-инъекций, вы находитесь на опасном пути. Это усложнит выполнение SQL-инъекций, но это не безопасный метод.

Кроме того, если вы кодируете текст, прежде чем поместить его в базу данных, у вас могут возникнуть проблемы с ним позже. Лучше хранить текст без изменений в базе данных и позаботиться о кодировке HTML при отображении текста.

2 голосов
/ 02 апреля 2009

Вы можете изменить порядок, чтобы поставить проблемные случаи первыми. Или вы можете перебрать строку и создать новую строку, анализируя каждый символ по очереди и добавляя его или желая замену. В противном случае вы могли бы использовать для этого готовую библиотеку / функцию, хотя я не разбираюсь в этом языке, поэтому не могу назвать ее.

1 голос
/ 02 апреля 2009

Как упомянуто в предыдущих постах, переупорядочение ваших «замен» должно обеспечить быстрое решение вашей конкретной проблемы, и вам настоятельно рекомендуется также рассмотреть параметризованные запросы.

Другим предложением является поиск встроенных библиотек .net для кодирования, в частности библиотеки Microsoft.Security.Application.AntiXss , которая, на мой взгляд, лучше, чем System.Web.HttpUtility .HtmlEncode, потому что он использует подход «белого списка», а не «черного списка».

Вы можете найти больше информации об этом здесь :

Надеюсь, это поможет.

1 голос
/ 02 апреля 2009

Изменить порядок, как предложили другие люди. Если вы обнаружите два случая, которые конфликтуют друг с другом и не могут быть решены путем изменения порядка, добавьте дополнительную замену, например:

teksti = teksti.Trim()
teksti = Replace(teksti, "&", "THISISANAMP")
teksti = Replace(teksti, ";", "& #59;")
teksti = Replace(teksti, "#", "& #35;")
teksti = Replace(teksti, "THISISANAMP", "&amp;") ''newly added
teksti = Replace(teksti, "<", "& lt;")
teksti = Replace(teksti, ">", "& gt;")
teksti = Replace(teksti, """", "& quot;")
teksti = Replace(teksti, "'", "& #8217;")
teksti = Replace(teksti, "%", "& #37;")
teksti = Replace(teksti, "@", "& #64;")

Это самый простой способ изменить ваш код.

0 голосов
/ 26 июня 2018

Для меня это работало нормально:

yourString = HttpUtility.HtmlDecode(yourString)

Убедитесь, что импортировали System.Web

Таблица кодов символов html

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