ASP.NET приложения и ошибка 400 - Bad Request
Мне иногда присылают письма с указанием на то, что наш сайт выдает 400 ошибку - Bad Request. Единственное найденное на сегодня решение - это почистить куки для сайта msug.vn.ua, после чего он снова работает.
После того, как проблема была замечена участниками ДОУ, которые славятся "любовью" к продуктам и технологиям Microsoft, они предложили много различных вариантов причины этой проблемы: от криворукости программистов (привет, Telligent!) до кривости платформы ASP.NET. Как ни странно, но ошибка 400 Bad Request, как правило, вылетала в браузере FF (иногда в Ghrome и Safari), хотя трудно сказать, если ли какая-то зависимость.
Аналогичная проблема была замечена и на других сайтах, написанных на ASP.NET, а именно на progg.ru и progblog.ru, владельцы которых являются очень компетентными специалистами, что отбрасывает первую версию ДОУ.
При исследовании проблемы были замечены следующие куки - виновники проблемы:
Это куки _utmz и _utma, которые, как известно, принадлежат Google Analytics.
Теперь разберемся, почему возникает ошибка 400 Bad Request:
From Stefan on the ASP.Net team: http://forums.asp.net/p/1431148/3221542.aspx
In current versions of ASP.NET Urls containing characters like the colon character will be rejected as a potential security threat. The historical reason for this is that the underlying NTFS file system supports alternate resource streams that can be accessed with names like "yourfile.txt:hiddendata.txt". Blocking the colon character from Urls prevents poorly written applications from accidentally working with alternate resource streams.
There is also a limitation in current versions of ASP.NET that incoming Urls need to map to the NTFS file system for purposes of determining managed configuration data.
In ASP.NET 4 these limitations can be optionally removed. However these changes are in the Beta 2 version of ASP.NET 4 - they are not in Beta 1. We tried out the Url listed earlier in this forum post and confirmed that with our internal builds of ASP.NET 4 you can use that style of Url and process it without any 400 error.
Другими словами, эта ошибка возникает, если URL содержит некорректные символы (это касается как GET так и POST запросов, куки и других переменных).
Что нам говорит Google по этому вопросу?
- на форуме Google Analytics обсуждается эта проблема - "Analytics producing dangerous Cookie error" - склоняются к тому, что Google не делает encoding / decoding своим значениям куки (в ASP.NET это делается с помощью HttpServerUtility.Encode и HttpServerUtility.Decode);
- Why do I get HTTP/1.1 400 Bad Request errors? - из всех вариантов только отсутствие encoding более менее реально.
Таким образом, какие можно сделать выводы:
- ни разработчики, ни ASP.NET здесь не при чем (хотя является ли это поведение правильным в данном случае - не понятно) - больше того, технология позволяет отлавливать подозрительные запросы на уровне дизайна.
- скорее всего (это не точно на 100%) проблема заключается в том, что google analytics не энкодирует строки перед сохранением
- почему ошибка возникает именно в FF - ответить сложно (здесь, здесь и еще много где обсуждается эта проблема), но решением всегда выступает очистка куки, поэтому можно предположить, что причина где-то кроется в недрах FireFox (особенности обработки куки, extensions и т.д.)
Последнее время проблема показывается очень редко, но нельзя исключать возможности ее появления в будущем. Если кто-то сталкивался с похожими проблемами - дайте знать.
Компании из статьи
Microsoft Украина | Украинское подразделение компании Microsoft. |