Запретить прямой URL-доступ к методу действия - PullRequest
10 голосов
/ 01 декабря 2011

Я пытаюсь найти способ запретить прямой доступ к моим методам действий. По сути, я хочу, чтобы мои пользователи нажимали на ссылки для навигации вместо того, чтобы вводить URL-адрес прямо в адресную строку в своих браузерах.

Теперь я знаю, что это можно сделать, проверив urlreferrer в объекте запроса, но это ненадежно и слабо, потому что urlreferrer может быть легко изменен, и некоторые из наборов безопасности фактически удаляют его из запроса.

Так кто-нибудь из вас знает, как это сделать в asp.net mvc3?

Ответы [ 5 ]

13 голосов
/ 10 октября 2014

Ниже приведен код для метода NoDirectAccessAttribute, чтобы ограничить прямой доступ к любому классу или методу действия, который применяет атрибут NoDirectAccess

using System;
using System.Web.Mvc;
using System.Web.Routing;

[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 = "Index", area = "" }));  
        }
    }
}

Используйте фильтр действий следующим образом для любого контроллера или метода действия, для которого вы используетене требуется, чтобы пользователь запрашивал его напрямую

[NoDirectAccess]
public ActionResult IsUsernameUnique()

В приведенном выше примере любой прямой доступ к методу действия IsUsernameUnique автоматически перенаправляет пользователя к методу действия Home / Index.

3 голосов
/ 01 декабря 2011

Я не уверен, но, может быть, это предложение может помочь вам, чувак давайте подумаем, что у вас есть такой URL

www.yoursite.com/home.aspx

ки? чтобы ваш пользователь не просматривал эту страницу напрямую, вы можете переписать URL-адрес следующим образом

www.yoursite.com/fdmf489ruv30/home.aspx

и в этом URL часть "fdmf489ruv30" является уникальной строкой, которую вы создали в session_start и уничтожите в session_end

Вы поняли или вам нужно больше описания этой идеи ?! Вы можете искать этот тип переписывания URL чувак.

0 голосов
/ 19 августа 2017

Используйте этот код в 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 = "" }));
            }
        }
    }
0 голосов
/ 01 декабря 2011

невозможно надежно гарантировать, что авторизованный пользователь НЕ МОЖЕТ подделать действительный запрос.
В конце концов, , если браузер может создать «действительный запрос», то и уполномоченный можетuser !

Тем не менее, это необычное требование, и мне интересно знать, в чем его причина?

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

Как предлагали другие, вы можете создать случайный «токен» для каждой сессии и указать его в URL (либо в виде пути, либо в виде строки запроса).

Было бы еще лучше использовать JavaScript для этого.Сделайте скрытый ввод с этим «токеном».Затем перехватите событие click каждой ссылки, добавьте значение «токен» к URL-адресу, затем перейдите к URL-адресу.

Вы можете улучшить JavaScript, чтобы как-то «обработать» свой токен перед его использованием, и минимизировать свой JavaScript, чтобы скрыть его ... это определенно удержит даже пользователей выше среднего уровня от работы с вашими URL-адресами.

Существует множество возможных решений, но «правильное» решение действительно зависит от того, какое именно поведение вы пытаетесь предотвратить.

0 голосов
/ 01 декабря 2011

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

Внутри другого действия (перенаправленного) сравните значение сеанса с параметром действия. Если значения равны, пользователь попадает туда, нажимая кнопку, в противном случае он попадает туда, меняя URL. Надеюсь, это поможет.

вопрос по Stackoverflow

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