Достаточно ли использовать HTMLEncode для отображения загруженного текста? - PullRequest
3 голосов
/ 31 января 2012

Мы разрешаем пользователям загружать изображения и предоставлять текстовое описание. Пользователи могут просмотреть это через всплывающее окно (на самом деле div) через javascript. Загруженный текст является параметром для функции JavaScript. Я беспокоюсь о XSS, а также найти проблемы с HTMLEncode ().
Мы используем HTMLEncode для защиты от XSS. К сожалению, мы обнаруживаем, что HTMLEncode () заменяет только «<» и «>». Нам также необходимо заменить одинарные и двойные кавычки, которые могут включать люди. Есть ли одна функция, которая будет выполнять все эти символы специального типа, или мы должны сделать это вручную через .NET string.Replace ()?

Ответы [ 4 ]

2 голосов
/ 31 января 2012

К сожалению, мы обнаруживаем, что HTMLEncode () заменяет только «<» и «>».

Если вы говорите о HttpServerUtility.HtmlEncode , то действительно кодирует символ двойной кавычки. По некоторым причинам он также кодируется как символьные ссылки на диапазон от U + 0080 до U + 00FF.

То, что он не кодирует, это одиночная кавычка. Немного обидно, но обычно вы можете обойти это, используя только двойные кавычки в качестве разделителей значений атрибутов в вашем HTML / XML. В этом случае достаточно HtmlEncode, чтобы предотвратить HTML-инъекцию.

Тем не менее, javascript в ваших тегах, и HtmlEncode явно недостаточно для того, чтобы экранировать содержимое, чтобы перейти в строковый литерал JavaScript. Кодировка JavaScript отличается от кодировки HTML, поэтому, если вы беспокоитесь о одинарных кавычках, вам нужно использовать строковый кодировщик JS.

(Кодер JSON - хорошее начало для этого, но вы хотели бы убедиться, что он кодирует символы U + 2028 и U + 2029, что, к сожалению, допустимо в JSON, но не в JavaScript. Также вам может понадобиться немного Разнообразие HTML-экранирования, если у вас есть JavaScript в контексте HTML. Это может стать проблематичным, обычно лучше избегать этих проблем, скрывая содержимое, которое вы хотите, в простом HTML, например, в скрытом вводе или пользовательском атрибуте. , где вы можете использовать стандартное экранирование HTML, а затем прочитать эти данные из DOM в JS.)

0 голосов
/ 19 марта 2012

Если вы используете ASP.NET MVC2 или ASP.NET 4, вы можете заменить <% = на <%: для кодирования выходных данных. Безопасно использовать для всего, что кажется (например, HTML-помощники). </p>

Здесь есть хорошая запись: Новый синтаксис <%:%> для вывода кодировки HTML в ASP.NET 4 (и ASP.NET MVC 2)

0 голосов
/ 01 февраля 2012

как насчет htmlencode всех входных данных с помощью этой расширенной функции:

private string HtmlEncode(string text)
        {
            char[] chars = HttpUtility.HtmlEncode(text).ToCharArray();
            StringBuilder result = new StringBuilder(text.Length + (int)(text.Length * 0.1));

            foreach (char c in chars)
            {
                int value = Convert.ToInt32(c);
                if (value > 127)
                    result.AppendFormat("&#{0};", value);
                else
                    result.Append(c);
            }

            return result.ToString();
        }

эта функция преобразует все неанглийские символы, символы, кавычки и т. Д. В html-сущности. попробуйте и дайте мне знать, если это поможет ..

0 голосов
/ 31 января 2012

Если текстовое описание встроено в строковый литерал JavaScript, то для предотвращения XSS вам потребуется экранировать специальные символы, такие как кавычки, обратные слэши и символы новой строки. HttpUtility.HtmlEncode метод не подходит для этой задачи.

Если строковый литерал JavaScript, в свою очередь, встроен в HTML (например, в атрибут), то вам потребуется также применить кодировку HTML поверх экранирования JavaScript.

Вы можете использовать библиотеку Microsoft Anti-Cross Site Scripting для выполнения необходимого экранирования и кодирования, но я рекомендую вам попытаться избежать этого самостоятельно. Например, если вы используете WebForms, рассмотрите возможность использования элемента управления <asp:HiddenField>: установите его свойство Value (которое будет автоматически кодироваться в HTML) в коде на стороне сервера и получите доступ к свойству value из client- код стороны.

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