10 октября 2014
Кравченко Виктор

ASP.NET MVC. Как запретить доступ к файлам сайта?

VB.NET MVC 4 ASP.NET .NET
01

Иногда бывает необходимо запретить прямой доступ по ссылке вида http://codius.ru/mypasswords.txt к файлу mypasswords.txt, расположенному в корневой папке вашего сайта. Сделать это достаточно просто.

02

Необходимо в начале процедуры RegisterRoutes файла Global.asax.vb указать routes.RouteExistingFiles = True:

03 VB.NET
1
2
3
4
5
6
7
8
9
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.RouteExistingFiles = True
routes.IgnoreRoute("{resource}.axd/{*pathInfo}") routes.MapRoute( _ "Default", _ "{controller}/{action}/{id}", _ New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _ ) End Sub
04

Что будет происходить теперь? Теперь при получении запроса, файл будет возвращен только в том случае, если не будет найдено подходящего маршрута. А поскольку ссылка на наш файл попадает под дефолтный маршрут Default, то при обращении к файлу будет выдана ошибка, что ни контроллер, ни действие не были найдены (у нас нет контроллера mypasswords.txt):

05
06 На заметку:
Необходимо принять во внимание тот факт, что теперь доступ абсолютно ко всем файлам будет проверяться через роутинг! А это означает, что не будет доступа — ни к файлу robots.txt, так необходимому браузерам, ни к изображениям, ни к файлам стилей, вроде site.css, ни к прочим другим.
07

Поэтому для нормального функционирования сайта, необходимо добавить исключения, для жизненно необходимых файлов:

08 VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Shared Sub RegisterRoutes(ByVal routes As RouteCollection) routes.RouteExistingFiles = True
routes.IgnoreRoute("robots.txt")
routes.IgnoreRoute("Content/{all}") ' {all} означает, что к исключениям нужно добавить все содержимое папки Content
routes.IgnoreRoute("Scripts/{all}")
routes.IgnoreRoute("{resource}.axd/{*pathInfo}") routes.MapRoute( _ "Default", _ "{controller}/{action}/{id}", _ New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _ ) End Sub
09

Также следует иметь ввиду ряд нюансов:

10
  • не все файлы будут обрабатываться дефолтным маршрутом. Так, например, запрос вида http://codius.ru/account/personal/data/mypasswords.txt покажет вам файл, потому что, (помните?) подходящего маршрута не найдено! Чтобы такой проблемы не было нужно добавить фиктивный маршрут routes.MapRoute("Default", "{controller}/{action}/{param}/{id}")
  • некоторые пути файлов могут совпадать с реально существующими маршрутами, например физический путь изображения http://codius.ru/images/get/someimage.jpg, может совпадать с контроллером Images и действием Get.
12

Похожие запросы:

  • Using RouteExistingFiles to block access to existing files even if no route exists
  • Preventing access to folders using RouteExistingFiles property
  • RouteExistingFiles Property
  • Routes.RouteExistingFiles does nothing, very confused
  • ASP.NET MVC 3: RouteExistingFiles = true seems to have no effect
comments powered by HyperComments