2011-12-01 37 views
7

Estoy tratando de encontrar una forma de denegar el acceso directo a mis métodos de acción. Básicamente, quiero que mis usuarios hagan clic en los enlaces para navegar en lugar de escribir la URL directamente en la barra de direcciones en sus navegadores.Denegar el acceso directo a la URL al método de acción

Ahora sé que esto se puede hacer comprobando el urlreferrer en el objeto de solicitud, pero esto es poco confiable y débil porque el urlreferrer se puede modificar fácilmente y algunas suites de seguridad realmente lo eliminan de la solicitud.

¿Alguno de ustedes sabe de alguna manera de hacer esto en asp.net mvc3?

+0

Cómo "seguro" no esta necesidad de ser? ¿Desea evitar que los usuarios puedan marcar y escribir URLs? ¿O realmente quiere hacerlo seguro contra personas que realmente saben cómo falsificar JavaScript y las cookies? –

+0

Quiero hacer esto lo más seguro posible, por lo que el urlreferrer no es realmente adecuado, ya que se puede falsificar con bastante facilidad – Duy

+0

¿Esto es para prevenir CSRF? ¿O realmente necesita evitar que incluso los usuarios "autorizados" falsifiquen solicitudes válidas? –

Respuesta

3

no estoy seguro, pero tal vez esta oferta puedo ayudarle tipo permite creer que tiene una URL como esta

www.yoursite.com/home.aspx 

bien? para evitar su usuario cejas directamente esta página puede volver a escribir que URL como esta

www.yoursite.com/fdmf489ruv30/home.aspx 

y en este url la parte "fdmf489ruv30" es una cadena única que creó en session_start y lo destruirá en Session_End

¿Lo entiende o necesita más información sobre esta idea? puede buscar este tipo de amigo reescribiendo url.

+0

Esta es una buena idea. Pero, ¿no sería igual de efectivo si el ID único fuera una cadena de consulta? –

+0

Realmente no quiero hacer esto porque eso haría las urls desordenadas y no amigables. – Duy

+0

sí, es una mala idea para SEO (trate de obtener un mejor rango en google por otros conceptos de SEO). y sobre la cadena de consulta, no probé si mi self.try y decirme el resultado –

0

Una forma rápida de hacerlo es establecer una sesión que contenga un número aleatorio en la acción que está redireccionando, también pasar el número aleatorio como un parámetro a la otra acción.

Dentro de la otra acción (redirigida), compare el valor de la sesión con el parámetro de la acción. Si los valores son iguales, el usuario está llegando pulsando el botón, de lo contrario, el usuario llega cambiando la URL. Espero eso ayude.

question on Stackoverflow

0

Es imposible para garantizar con seguridad que un usuario no autorizado no puede falsificar una solicitud válida.
Después de todo, si el navegador puede crear una "solicitud válida", entonces también lo puede hacer un usuario autorizado!

Sin embargo, este es un requisito inusual, y estoy interesado en saber cuál es la motivación detrás de esto.

Existen, sin embargo, varias formas de dificultar la suplantación de la solicitud.
Dado que ningún método será completamente seguro, puede intentar ofuscar y hacerlo tedioso para que alguien pueda suplantar sus peticiones.

Como han sugerido otros, podría crear un "token" aleatorio por sesión y requerirlo en la URL (ya sea como una ruta o como una cadena de consulta).

Sería incluso mejor utilizar JavaScript para esto. Renderiza una entrada oculta con este "token". Luego, intercepte el evento click de cada enlace, agregue el valor "token" a la URL, luego navegue a la URL.

Puede mejorar el JavaScript para "procesar" su token de algún modo antes de usarlo, y minimizar su JavaScript para ofuscarlo ... esto definitivamente disuadiría incluso a los usuarios por encima del promedio de modificar sus URL.

Existen muchas soluciones posibles, pero la solución "correcta" realmente depende de qué comportamiento específico está tratando de evitar.

+0

de acuerdo con esto. ¿Qué está tratando de lograr? Puede crear un contenedor de página html global y usar acciones basadas en jax devolviendo html que haya insertado. Las acciones de Ajax pueden restringirse desde el acceso directo a la url a través de atributos u otros medios de token ocultos. – Roman

7

A continuación se muestra el código para el método NoDirectAccessAttribute para restringir el acceso directo a cualquier método de clase o acción que se aplica el atributo 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 = "" })); 
     } 
    } 
} 

uso del filtro acción de la siguiente manera para cualquier método de control o acción en que don' t desea usuario solicitar directamente

[NoDirectAccess] 
public ActionResult IsUsernameUnique() 

En el ejemplo anterior, cualquier acceso directo al método de acción IsUsernameUnique redirigirá automáticamente al usuario el método de acción Inicio/Índice.

+1

resolvió el problema en cierta medida (algún nivel) – Aji

0

Utilice este código en Global.asax.cs y Call [NoDirectAccess] a todos los controladores

//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 = "" })); 
      } 
     } 
    } 
Cuestiones relacionadas