拒绝直接URL访问action方法
本文关键字:action 方法 访问 URL 拒绝 | 更新日期: 2023-09-27 18:16:13
我正试图找到一种方法来拒绝任何直接访问我的操作方法。基本上,我希望我的用户点击链接来导航,而不是直接在浏览器的地址栏中输入URL。
现在我知道这可以通过检查请求对象中的urlreferrer来完成,但这有点不可靠和弱,因为urlreferrer很容易被修改,而且一些安全套件实际上从请求中删除了它。
你们知道在asp.net mvc3中怎么做吗?
下面是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的问题