Я думаю, что вы атакуете его с неправильной точки зрения, пытаясь закодировать все опубликованные данные.
Обратите внимание, что «<
» также может поступать из других внешних источников, таких как поле базы данных, конфигурация, файл, канал и так далее.
Кроме того, "<
" по своей природе не опасен. Это опасно только в определенном контексте: при написании строк, которые не были закодированы в вывод HTML (из-за XSS).
В других контекстах разные подстроки опасны, например, если вы записываете предоставленный пользователем URL в ссылку, подстрока "javascript:
" может быть опасной. Символ одинарной кавычки, с другой стороны, опасен при интерполяции строк в запросах SQL, но совершенно безопасен, если он является частью имени, переданного из формы или считанного из поля базы данных.
Суть в том, что вы не можете отфильтровать случайный ввод для опасных символов, потому что любой символ может быть опасным при определенных обстоятельствах. Вы должны кодировать в точке, где некоторые конкретные символы могут стать опасными, потому что они переходят на другой язык, где они имеют особое значение. Когда вы пишете строку в HTML, вы должны кодировать символы, которые имеют особое значение в HTML, используя Server.HtmlEncode. Если вы передаете строку в динамический оператор SQL, вы должны кодировать разные символы (или, лучше, позволить платформе сделать это за вас, используя подготовленные операторы или тому подобное) ..
Когда вы уверены, что кодируете HTML везде, где вы передаете строки в HTML, тогда задайте validateRequest="false"
в директиве <%@ Page ... %>
в ваших файлах .aspx
.
В .NET 4 вам может потребоваться сделать немного больше. Иногда необходимо также добавить <httpRuntime requestValidationMode="2.0" />
в web.config ( ссылка ).