#c# #asp.net #html #unicode #character-encoding
#c# #asp.net #HTML #юникод #кодировка символов
Вопрос:
Мне нужно очистить данные от вредоносного содержимого в форме (веб-сайт которой закодирован в формате UTF-8), поэтому я делаю следующее:
myTextBox.Value = System.Web.HttpUtility.HtmlEncode(value);
где value
— данные, которые должны быть помещены в текстовое поле.
Это позволяет корректно удалять вредоносные данные, такие как вызовы Javascript, но также преобразует японские символы в их эквиваленты в формате UTF-8, такие как amp;#24859;
Есть ли способ пропустить кодирование этих символов, например, какого-то диапазона?
Ответ №1:
Возможно, это больше не проблема для вас, но у меня только что была такая же проблема, и я нашел решение, которым, как мне показалось, я должен поделиться с вами.
Класс HttpUtility имеет метод под названием HtmlAttributeEncode, который будет кодировать только кавычки («), амперсанды (amp;) и левые угловые скобки (<).
Ответ №2:
Получите символов HTML ссылка последовательность символов amp;#24859;
(т. е. восемь один байт amp;
, #
, 2
, 4
, 8
, 5
, 9
, ;
в их традиционные значения ASCII), представляющий элемент кода Unicode точка не совпадает с кодировкой UTF-8 байт-последовательность, отражающая кодировку UTF-8 того же кодекса точки (т. е. 4 шестнадцатеричных байт 0xf0 в системе 0xA4 0xA1 0x99).
http://people.w3.org/rishida/tools/conversion/
Что из этого происходит?
Это простое консольное приложение показывает, что обычные кодовые точки Unicode (при условии, что они не представляют собой что-то вроде <, требующее экранирования HTML) не переводятся:
using System;
using System.Web;
namespace ConsApp
{
class Program
{
static void Main(string[] args)
{
int lp = 0;
string[] Inputs = {"U00024859", "<tag>U00024859<\tag>"};
foreach (var Test in Inputs)
{
string HTML = HttpUtility.HtmlEncode(Test);
Console.WriteLine(String.Format(HTML != Test ? "String {0} Changed" : "String {0} Unchanged", lp));
lp ;
}
}
}
}
Ваша проблема в том, что текст уже преобразован в последовательность ссылок на символы, и HTML-Encode предполагает, что вы хотите видеть символы amp;. Точно так же, как в моем втором примере, где < преобразуется в amp;<
Комментарии:
1. Последовательность символов ссылки на символ HTML (первая)
2. @acconrad Итак, ваши данные уже частично закодированы. Вам нужно декодировать частично закодированные данные и кодировать все целиком — непростая задача.
3. То есть я, по сути, кодирую это дважды?
4. @acconrad Да, по сути, это как если бы кто-то ввел
amp;#24859;
текст в вашу форму, и вы хотите, чтобы он отображался таким образом, а не преобразовывался во что-то другое. Основная проблема в том, что вы пытаетесь избежать внедрения. Поскольку вы говорите: «Я не собираюсь позволять браузеру интерпретировать эти коды, поэтому я экранирую их, чтобы они были представлены буквально»., браузеру тогда не разрешается интерпретировать последовательность символов. Надеюсь, кто-то с большим опытом решения этой проблемы сможет подключиться…5. @acconrad HtmlDecode(«amp;#24859;»), похоже, работает (указывает кодовую точку unicode, которая затем не изменяется HtmlEncode) — но, конечно, что, если HtmlEncode(HtmlDecode (вредоносный)) == вредоносный…