Как запретить пользователю вводить прямой URL-адрес

#asp.net

#asp.net

Вопрос:

Я использую ASP.NET Платформа 4.0.У меня есть каталог, который содержит 10 файлов PDF, т. е. pdf1, pdf2 ….pdf10. При нажатии кнопки я использую ответ.Перенаправление и передача пути к файлу Pdf, чтобы открыть его в браузере. но это позволяет пользователю просматривать путь (URL) к папке PDF, используя этот URL, он может напрямую открывать любой другой PDF. Как я могу запретить ему доступ к PDF напрямую с URL

Комментарии:

1. Я думаю, это будет сложно, если вы не создадите какой-либо механизм аутентификации.

Ответ №1:

Используйте Request.ServerVariables["HTTP_REFERER"] это сообщит вам, откуда поступил запрос. Если его нет на вашем сайте, примите соответствующие меры.

например

 if(Request.ServerVariables["HTTP_REFERER"].ToLower().IndexOf("mysite.com") == -1){
    // Not from my site
    Response.Redirect("NotAllowed.aspx");
}
  

Комментарии:

1. Не могли бы вы, пожалуйста, добавить подробности, что вы хотите сказать.

2. Это не сработает, если перенаправленный URL-адрес переходит непосредственно в pdf, поскольку этот код негде запустить. Что нужно сделать, так это перенаправить на httphandler, чтобы затем можно было выполнить проверку перед потоковой передачей PDF.

Ответ №2:

Эта ссылка может помочь вам запретить ему доступ к PDF напрямую с URL-адреса.

Комментарии:

1. Использование httphandler является правильным вариантом, если вы хотите выполнить какую-либо проверку на стороне сервера перед потоковой передачей PDF.

Ответ №3:

Используйте этот код в Global.asax.cs и вызывайте [NoDirectAccess] для всех контроллеров

     //Prevent direct URL access: Call [NoDirectAccess] to all controllers to block
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class NoDirectAccessAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Request.UrlReferrer == null ||
                        filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host)
            {
                filterContext.Result = new RedirectToRouteResult(new
                               RouteValueDictionary(new { controller = "Home", action = "Login", area = "" }));
            }
        }
    }
  

Ответ №4:

Вам нужно будет добавить безопасный уровень. Если вы используете MVC, это, вероятно, будет проще реализовать, поскольку вы будете выполнять авторизацию в действии контроллера. Однако для классического ASP вам, вероятно, потребуется реализовать пользовательский обработчик.

Ответ №5:

Простого решения для этого нет. Вы могли бы разработать какой-то скользящий код на основе даты / времени сервера, который должен быть частью строки запроса, и проверять правильность этого при загрузке страницы, если вы сделаете это достаточно сложным / длинным, тогда люди не смогут вводить это вручную.