Вот один (из нескольких тысяч возможных примеров):
Возьмите этот простой ввод XSS:
<script>alert('XSS');</script>
//Now we URI encode it:
%3Cscript%3Ealert(%27XSS%27)%3B%3C%2Fscript%3E
//Now we URI encode it again:
%253Cscript%253Ealert(%2527XSS%2527)%253B%253C%252Fscript%253E
Канонизация ввода, который был закодирован один раз, приведет к исходному вводу, но в случае ESAPI третий ввод вызовет IntrusionException
, потому что НИКОГДА не существует допустимого варианта использования, когда пользовательский ввод будет закодирован в URI более одного раза. В этом конкретном примере канонизация означает, что «все данные URI будут преобразованы в их фактическое символьное представление». Кстати, ESAPI делает больше, чем просто декодирует URI. Это важно, если вы хотите выполнять как проверку безопасности, так и/или бизнес-проверку, используя регулярные выражения — основное использование регулярных выражений в большинстве приложений.
Как минимум, канонизация дает вам уверенность в том, что скрытно ввести вредоносные данные в приложение непросто: цель состоит в том, чтобы ограничиться заведомо правильными значениями (белый список) и отклонить все остальное.
Что касается вашего опрометчивого комментария здесь:
We are not encoding output given that after the input validation, data becomes trusted.
Вот грязная правда: Javascript, XML, JSON и HTML не являются «обычными языками». Они недетерминированы. На практике это означает, что математически невозможно написать регулярное выражение для отклонения всех попыток вставки HTML или Javascript в ваше приложение. Посмотрите на шпаргалку по уклонению от XSS-фильтра, которую я разместил выше.
Ваше приложение использует jquery? Следующий ввод является вредоносным:
$=''|'',_=$+!"",__=_+_,___=__+_,($)[_$=($$=(_$=""+{})[__+__+_])+_$[_]+(""+_$[-__])[_]+(""+!_)[___]+($_=(_$=""+!$)[$])+_$[_]+_$[__]+$$+$_+(""+{})[_]+_$[_]][_$]((_$=""+!_)[_]+_$[__]+_$[__+__]+(_$=""+!$)[_]+_$[$]+"("+_+")")()
Таким образом, вы должны кодировать все данные при выводе пользователю, для надлежащего контекста это означает, что если часть данных будет сначала вводиться в функцию javascript, а затем отображается как HTML, вы кодируете для Javascript, а затем HTML. Если он выводится в поле данных HTML (например, поле ввода по умолчанию), вы кодируете его для атрибута HTML.
На самом деле БОЛЕЕ ВАЖНО выполнять кодирование вывода, чем фильтрацию ввода для защиты от XSS. (Если бы я ДОЛЖЕН просто выбрать один...)
Шаблон, которому вы хотите следовать в веб-разработке, заключается в том, что любой ввод, поступающий из внешнего мира, всегда рассматривается как вредоносный. Вы кодируете каждый раз, когда передаете динамический интерпретатор.
person
avgvstvs
schedule
30.10.2014