2011-12-01 8 views
7

Sto tentando di trovare un modo per negare qualsiasi accesso diretto ai miei metodi di azione. Fondamentalmente quello che voglio che i miei utenti facciano clic sui link per navigare invece di digitare l'URL direttamente nella barra degli indirizzi nei loro browser.Negare l'accesso diretto all'URL al metodo di azione

Ora so che questo può essere fatto controllando l'urlreferrer nell'oggetto richiesta ma questo è un po 'inaffidabile e debole perché l'urlreferrer può essere facilmente modificato e alcune delle suite di sicurezza lo rimuovono effettivamente dalla richiesta.

Così qualcuno di voi sa come farlo in asp.net mvc3?

+0

Come "sicura" fa questo bisogno di essere? Vuoi solo impedire agli utenti di poter aggiungere ai segnalibri e/o digitare URL? O vuoi davvero renderlo sicuro contro le persone che sanno davvero come falsificare Javascript e i cookie? –

+0

Voglio renderlo il più sicuro possibile, motivo per cui l'urlreferrer non è veramente adatto in quanto può essere facilmente falsificato – Duy

+0

È questo per prevenire CSRF? O hai davvero bisogno di impedire anche agli utenti "autorizzati" di spoofing di richieste valide? –

risposta

3

non sono sicuro, ma forse questa offerta può aiutare tizio consente pensi di avere un URL come questo

www.yoursite.com/home.aspx 

ok? per evitare l'utente al sopracciglia direttamente questa pagina è possibile riscrivere si URL come questo

www.yoursite.com/fdmf489ruv30/home.aspx 

e in questo URL nella parte "fdmf489ruv30" è una stringa univoca che si è creato su session_start e la distruggerò il Session_End

hai capito o hai bisogno di più informazioni su questa idea ?! puoi cercare questo tipo di riscrittura url.

+0

Questa è una buona idea. Ma non sarebbe altrettanto efficace se l'id univoco fosse una stringa di query? –

+0

Non voglio davvero farlo perché ciò renderebbe gli URL disordinati e non amichevoli. – Duy

+0

sì, è una cattiva idea per il SEO (prova ad ottenere un rango migliore in Google da altri concetti di SEO). e riguardo la stringa di query, non ho verificato se il mio self.try e dicendomi il risultato –

0

Un modo rapido per farlo è impostare una sessione contenente un numero casuale nell'azione che sta reindirizzando, anche passare il numero casuale come parametro all'altra azione.

All'interno dell'altra azione (reindirizzata), confrontare il valore della sessione con il parametro dell'azione. Se i valori sono uguali, l'utente arriva premendo il pulsante, altrimenti l'utente arriva modificando l'URL. Spero che sia d'aiuto.

question on Stackoverflow

0

E 'impossibile al fine di garantire in modo sicuro che un utente autorizzato non può falsificare una richiesta valida.
Dopo tutto, se il browser può creare una "richiesta valida", allora anche un utente autorizzato!

Tuttavia, questo è un requisito insolito, e sono interessato a sapere qual è la motivazione dietro di esso?

Esistono, tuttavia, diversi modi per rendere più difficile lo spoofing della richiesta.
Poiché nessun metodo sarà completamente sicuro, è possibile provare a offuscare e renderlo noioso per qualcuno per falsificare le vostre richieste.

Come altri hanno suggerito, è possibile creare un "token" casuale per sessione e richiederlo nell'URL (come percorso o come querystring).

Sarebbe ancora meglio usare JavaScript per questo. Rendi un input nascosto con questo "token". Quindi, intercettare l'evento click di ciascun collegamento, aggiungere il valore "token" all'URL, quindi accedere all'URL.

È possibile migliorare il codice JavaScript per "processare" il token in qualche modo prima di utilizzarlo e ridurre il codice JavaScript per offuscarlo ... questo sicuramente scoraggerebbe anche gli utenti sopra la media dal modificare i propri URL.

Ci sono un sacco di soluzioni possibili, ma la soluzione "giusta" dipende molto dal comportamento specifico che si sta tentando di prevenire.

+0

D'accordo con questo. Cosa stai cercando di realizzare? È possibile creare un contenitore di pagine html globale e utilizzare azioni basate su Ajax che restituiscono l'html che è stato incorporato. Le azioni Ajax possono essere limitate dall'accesso all'URL diretto tramite attributi o altri mezzi di token nascosti. – Roman

7

Di seguito si riporta il codice per il metodo NoDirectAccessAttribute per limitare l'accesso diretto a qualsiasi metodo di classe o azione che applica l'attributo 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 = "" })); 
     } 
    } 
} 

utilizzare il filtro azione come segue per qualsiasi metodo di controllo o di azione in cui si don' la t vuole utente di richiedere direttamente

[NoDirectAccess] 
public ActionResult IsUsernameUnique() 

nell'esempio di cui sopra, qualsiasi accesso diretto al metodo di azione IsUsernameUnique reindirizza automaticamente l'utente al metodo di azione Home/Index.

+1

ha risolto il problema in qualche misura (un po 'di livello) – Aji

0

utilizzare questo codice in Global.asax.cs e Call [NoDirectAccess] per tutti i controller

//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 = "" })); 
      } 
     } 
    } 
Problemi correlati