URL-маршрутизация, обработчик изображений и "потенциально опасное значение Request.Path"
Я уже давно столкнулся с этой проблемой и решил попытаться разобраться с ней раз и навсегда, разместив здесь вопрос для размышлений. У меня есть обработчик изображения на веб-сайте .net 4, расположенном здесь:
https://www.amadeupurl.co.uk/ImageHandler.ashx?i=3604
(фактический домен удален для конфиденциальности)
Теперь это прекрасно работает и без проблем отображает изображение с веб-сервера, я говорю без проблем, потому что, если я получаю доступ к URL-адресу, он отлично работает, загрузка изображения не генерируется. Однако вчера кто-то посетил этот точный URL, и исключение было поднято в следующих строках:
Exception Generated
Error Message:
A potentially dangerous Request.Path value was detected from the client (?).
Stack Trace:
at System.Web.HttpRequest.ValidateInputIfRequiredByConfig() at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)
Technical Information:
DATE/TIME: 23/01/2013 03:50:01
PAGE: www.amadeupurl.co.uk/ImageHandler.ashx?i=3604
Я понимаю сообщение об ошибке, это не проблема, я просто не понимаю, почему она создается здесь, чтобы усугубить ситуацию. Я не могу ее реплицировать, например, я сказал, что нажимаю ссылку на загрузку изображения, исключение, Я использую URL-маршрутизацию и зарегистрировал обработчик для игнорирования, если это вызвало проблему со следующим кодом:
routes.Ignore("{resource}.ashx")
Я не уверен, почему еще я получаю ошибку или что еще попробовать.
Ответы
Ответ 1
Asp.Net 4.0+ поставляется с очень строгой встроенной проверкой запроса, частью которого являются потенциально опасные символы в URL-адресе, которые могут использоваться в атак XSS. Здесь указаны недопустимые символы по умолчанию:
< > * % & : \ ?
Вы можете изменить это поведение в своем файле конфигурации:
<system.web>
<httpRuntime requestPathInvalidCharacters="<,>,*,%,&,:,\,?" />
</system.web>
Или вернитесь к проверке .Net 2.0:
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
Очень распространенным недопустимым символом является %
, поэтому, если случайно (атака, веб-сканеры или просто нестандартный браузер) URL-адрес убегает, вы получаете следующее:
www.amadeupurl.co.uk/ImageHandler.ashx/%3Fi%3D3604
вместо этого:
www.amadeupurl.co.uk/ImageHandler.ashx/?i=3604
Обратите внимание, что %3F
является escape-символом для ?
. Символ считается недействительным с помощью проверки достоверности запроса Asp.Net и выдает исключение:
A potentially dangerous Request.Path value was detected from the client (?).
Хотя в сообщении об ошибке вы видите неизмененную версию символа (% 3F), которая больше ?
Вот хорошая статья о проверке запроса и о том, как с этим бороться
Ответ 2
Даже я сталкивался с этой проблемой, но для себя я случайно набрал & вместо? в URL
например:
example.com/123123¶meter1=value1&paameter2=value2
но на самом деле это должно быть:
example.com/123123?parameter1=value1&paameter2=value2