Разрешить использование японских символов в обход метода C # HtmlEncode

#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;) и левые угловые скобки (<).

http://msdn.microsoft.com/en-us/library/wdek0zbf.aspx

Ответ №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 (вредоносный)) == вредоносный…