拒绝直接URL访问action方法

本文关键字:action 方法 访问 URL 拒绝 | 更新日期: 2023-09-27 18:16:13

我正试图找到一种方法来拒绝任何直接访问我的操作方法。基本上,我希望我的用户点击链接来导航,而不是直接在浏览器的地址栏中输入URL。

现在我知道这可以通过检查请求对象中的urlreferrer来完成,但这有点不可靠和弱,因为urlreferrer很容易被修改,而且一些安全套件实际上从请求中删除了它。

你们知道在asp.net mvc3中怎么做吗?

拒绝直接URL访问action方法

下面是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操作方法。

我不确定,但也许这可以帮助你假设我们有一个url为

的页面
www.yoursite.com/home.aspx

为了避免你的用户直接浏览这个页面,你可以像这样重写你的url

www.yoursite.com/fdmf489ruv30/home.aspx

在这个url中,部分"fdmf489ruv30"是一个唯一的字符串,您在session_start上创建它,并将在session_end上销毁它

在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 = "" }));
            }
        }
    }

不可能安全地确保授权用户无法欺骗有效请求。
毕竟,如果浏览器可以创建"有效请求",那么授权用户也可以!

然而,这是一个不寻常的要求,我很想知道背后的动机是什么?

然而,有许多方法可以使欺骗请求变得更加困难。
由于没有任何方法是完全安全的,您可以尝试混淆,并使变得繁琐,使某人无法欺骗您的请求。

正如其他人建议的那样,您可以为每个会话创建一个随机的"令牌",并在URL中要求它(作为路径或作为查询字符串)。

使用JavaScript会更好。用这个"令牌"渲染一个隐藏的输入。然后,拦截每个链接的click事件,将"token"值附加到URL,然后导航到该URL。

你可以增强JavaScript在使用它之前以某种方式"处理"你的令牌,并缩小你的JavaScript来混淆它…这肯定会阻止甚至高于平均水平的用户修补您的url。

有很多可能的解决方案,但"正确"的解决方案实际上取决于你想要防止的具体行为。

一种快速的方法是在重定向的操作中设置一个包含随机数的会话,并将随机数作为参数传递给其他操作。

在另一个动作(重定向的动作)中,将会话的值与动作的参数进行比较。如果值相等,用户通过按按钮到达那里,否则,用户通过更改URL到达那里。希望能有所帮助。

关于Stackoverflow的问题