Я написал приложение, которое обрабатывает большинство исключений изящно, с неповрежденным дизайном страницы и хорошим сообщением об ошибке. Мое приложение ловит их все в событии и добавляет исключение в HttpContext.Curent.Context.Items
, а затем делает Server.Transfer
на страницу Error.aspx
. Я считаю, что это единственное жизнеспособное решение в ASP.NET, поскольку, похоже, нет другого способа сделать это централизованным и общим образом.Ручная обработка URI изящно в ASP.NET
Я также обрабатываю Application_Error
, и там я делаю осмотр исключения, которое произошло, чтобы выяснить, могу ли я обработать его изящно или нет. Исключения, которые я обнаружил, я могу обрабатывать изящно, такие, которые бросаются после того, как кто-то взломает URI, чтобы содержать символы, которые .NET Framework считает опасными или в основном просто незаконными на уровне файловой системы.
Такие идентификаторы URI может выглядеть например .:
http://exmample.com/"illegal"
http://example.com/illegal"/
http://example.com/illegal /
(обратите внимание на пробел перед косой чертой в конце последнего URI).
Я бы хотел, чтобы эти URI отвечали «404 Not Found» и дружественным сообщением, а также не приводили к отправке отчета об ошибке, чтобы избежать использования векторов атак DDOS и т. Д. Однако я не нашел элегантный способ поймать эти ошибки. Что мне делать теперь проверить exception.TargetSite.Name
собственность, и если он равен CheckInvalidPathChars
, ValidatePath
или CheckSuspiciousPhysicalPath
, я считаю это «исключение проверки пути» и реагировать с 404.
Это, кажется, как взломать, хотя. Во-первых, список имен методов, вероятно, не является полным, во-вторых, существует вероятность того, что имена этих методов будут заменены или переименованы в строку, что приведет к поломке моего кода.
Есть ли у кого-нибудь идеи, как я могу справиться с этим менее жестко-кодированным и гораздо более надежным способом?
PS: Я использую в своем приложении System.Web.Routing
, чтобы иметь чистые и разумные URI, если это имеет какое-либо значение для любого данного решения.
Я согласен, что это было бы лучшим решением. Если вы справитесь с проблемой до ее фактического появления, вы сохраните ресурсы сервера. Я также хочу добавить, что в вашем модуле вы, вероятно, должны присоединить функцию проверки URL-адреса к событию HttpApplication.BeginRequest. – regex
Спасибо за предложение. Теперь я реализовал его несколько иначе, но, вероятно, выберет большую часть этой логики в HttpModule, когда позволит время. –