Почему используется URL-адрес, содержащий двоеточие, который рассматривается как "потенциально опасный запрос"?
Кто-то (возможно, бот) отправил запрос со следующим URL-адресом моему веб-бланку ASP.NET 4.0 (работает на IIS 7.0):
http://ipaddress-of-my-applications-domain/bla1.bla2.bla3.bla4.bla5:)
Это вызвало System.Web.HttpException
. Я получил регистрационное письмо от ASP.NET HealthMonitoring, которое я настроил, сказав мне:
Потенциально опасное значение Request.Path было обнаружено у клиента (:).
Трассировка стека:
System.Web.HttpRequest.ValidateInputIfRequiredByConfig()
System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)
Почему двоеточие в URL-адресе "потенциально опасно"? Какие опасные вещи можно сделать с таким URL? У меня есть дыра в безопасности, о которой я не знаю?
Спасибо за объяснение заранее!
Edit
Я тестировал, что двоеточие в строке запроса (например, http://mydomain.com?Test=9:)
) не вызывает этого исключения.
Ответы
Ответ 1
В NTFS данный путь к файлу может иметь несколько связанных потоков данных. Помимо основного потока, также известного как $DATA
, могут быть другие, обычно используемые для хранения метаданных, таких как маркер интернет-зоны в загруженных файлах.
Альтернативные потоки данных доступны с помощью разделителя двоеточия, например. file.dat:$DATA
- альтернативный способ сказать file.dat
. Наличие ADS через Интернет вызвало у Microsoft некоторые проблемы с безопасностью в прошлом (например, возврат исходного кода страниц ASP вместо их выполнения), поэтому в качестве меры предосторожности они блокируют использование двоеточия в части пути URL, поскольку часть пути часто сопоставляется с файловой системой (хотя и не в вашем случае). Это вряд ли произойдет из строки запроса, поэтому она не блокируется.
Это далеко не самое плохое ложное положительное подтверждение запроса. Его антиинъекционные функции намного хуже. Я лично всегда отключил бы его, поскольку это глупая сломанная функция, которая никогда не может сделать ваш webapp безопасным; Это может сделать только надлежащее внимание к экранированию строк (и тяжелая санитация всего, что вы планируете использовать в качестве имени файла).
Существуют и другие символы, даже если вы отключите проверку запроса, вы не можете добавить часть пути для целей маршрутизации. В частности, косые черты (%2F
, %5C
и байтовые последовательности, которые были бы неверными, чередуя последовательности UTF-8, разрешающие их) и нулевой байт. Лучше быть консервативным в отношении того, что вы вложили в пути в целом.
Ответ 2
Я точно не помню, но Internet Explorer привязан к операционной системе, и он смог выполнить некоторые плохие вещи, такие как "con: sss" смог открыть консоль и выполнить некоторые командные команды и т.д., до того, как двоеточие рассматривается как протокол и окна позволяют вам переопределять/создавать новые протоколы, которые могут быть открыты и использованы вашей DLL. Любой, у кого больше опыта работы с com и url-прозвищами, может дать вам очень правильный ответ.
Ответ 3
Это связано с функцией проверки запроса ASP.NET, которая мешает клиентам атаковать ваш сайт. Функция включена по умолчанию.
Следующая ссылка объясняет лучше: http://www.asp.net/learn/whitepapers/request-validation