Вы HtmlEncode во время ввода или вывода?

Когда вы позвоните Microsoft.Security.Application.AntiXss.HtmlEncode? Вы делаете это, когда пользователь отправляет информацию, или вы делаете это, когда отображаете информацию?

Как насчет базовых вещей, таких как имя, фамилия, город, штат, почтовый индекс?


person danmine    schedule 14.11.2008    source источник


Ответы (4)


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

Кодируйте каждую строку.

person Corey Trager    schedule 14.11.2008

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

Если вы хотите кодировать раньше, примите меры, чтобы избежать двойного кодирования. Джоэл написал статью о том, как правильно использовать венгерскую нотацию, в которой он выступал за использование префиксов для определения того, что хранится в переменной. например: «us» для небезопасной строки, «ss» для безопасной строки.

usFirstName = getUserInput('firstName')

ssFirstName = cleanString(usFirstName);

Также обратите внимание, что не имеет значения, какой тип информации (город, почтовый индекс и т. Д.) - если любой из этих параметров не отмечен, возникнут проблемы.

person nickf    schedule 14.11.2008
comment
us означает небезопасно, а ss означает supersafe? : D - person LiraNuna; 24.11.2009

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

Вместо этого мы решили дезинфицировать ввод на его пути в систему, так как точек ввода было меньше, чем точек вывода. Мы дезинфицируем непосредственно перед вводом данных в БД, хотя мы не используем библиотеку Microsoft AntiXss, мы используем набор домашних методов, которые заносят в белый список диапазоны HTML-тегов и символов в зависимости от типа ввода.

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

person Dan Herbert    schedule 14.11.2008

Кодирование - это не свойство данных, это свойство транспортного механизма. Поэтому вам следует расшифровать данные при их получении и соответствующим образом закодировать перед передачей. Транспортный механизм определяет, какое кодирование необходимо.

Этот принцип верен независимо от того, является ли ваш транспортный механизм HTML, HTTP, дымовыми сигналами и т. Д. Хитрость заключается в том, чтобы знать, как выполнять типы кодирования вручную, и когда различные фреймворки делают шаги за вас автоматически. Например, ASP.NET будет кодировать данные, назначенные тексту System.Web.UI.WebControls.Button, но не текст, назначенный тексту System.Web.UI.WebControls.Literal. jQuery будет кодировать контент, который вы установили с помощью .innerText (), но не контент, который вы установили с помощью .innerHtml ().

person Frank Schwieterman    schedule 24.11.2009