2009-02-16 4 views
5

So come utilizzare l'attributo AntiForgeryToken di MVC ed è l'helper HTML associato per aiutare XSRF a proteggere i moduli POST della mia applicazione.Come proteggere le mie chiamate JETResult GET?

Può qualcosa di simile può essere fatto per JsonResults che implementano GET?

Per esempio, la mia vista contiene una chiamata onSubmit jQuery come tale:

$.getJSON("/allowActivity/YesOrNo/" + someFormValue, "{}", function(data) { 
    if(data.Allow) { 
    //Do something. 
    } 
}); 

Voglio fare certi che questo JsonResult è invocabile solo dalla pagina di destinazione.

EDIT:

Ho trovato this post di una domanda simile, senza alcuna risposta concreta.

Qual è il modo più semplice per garantire che il mio URL GET (non distruttivo) venga utilizzato solo da una chiamata AJAX dalla mia pagina?

risposta

8

È possibile utilizzare l'AntiForgeryToken combinato con alcune logiche personalizzate. La creazione del token AntiForgery sul server è la stessa, ma per impostazione predefinita il valore non è incluso in XmlHttpRequest.

Il valore di questo token è nel cookie HTTP solo "__RequestVerificationToken" e dovrebbe anche essere nei dati del modulo inviati al server. Quindi includere una coppia chiave/valore nella vostra XmlHttpRequest e utilizzare il ValidateAntiForgeryToken - attributo sul controller

EDIT:

Oggi ho provato ad utilizzare l'AntiForgeryToken per l'Ajax me richieste e funziona benissimo. Basta usare il seguente javascript:

$.post('my_url', $.getAntiForgeryTokenString(), function() { ... }); 

$.getAntiForgeryTokenString = function() { 
    return $(document.getElementsByName("__RequestVerificationToken")).fieldSerialize(); 
}; 

Sul lato server che non c'è bisogno di modificare il codice - basta usare l'attributo ValidateAntiForgeryToken- per la vostra azione.

Spero che questo aiuti

+0

Come ti integrare il valore __RequestVerificationToken con il $ o $ GetJSON .ajax chiamata? Ricorda, questa è una richiesta GET. –

+0

Leggere "Divulgazione del token nell'URL" da http://www.owasp.org/index.php/Cross-Site_Request_Forgest_(CSRF)_Prevention_Cheat_Sheet "Se le azioni sensibili sul lato server sono garantite per rispondere sempre e solo alle richieste POST, quindi non è necessario includere il token nelle richieste GET "La chiave è assicurarsi che il tuo GET non modifichi i dati. In caso contrario, non è necessario proteggere le richieste GET –

0

Si può fare qualcosa di simile ai metodi anti XSRF. Basta generare un ID inserendolo nel javascript e quando l'utente chiama il tuo url JSON, chiedi che l'url includa l'ID generato e controlli se è lì.

Una difesa contro XSRF utilizza anche sessionID come chiave, tuttavia non impedisce all'utente di eseguirlo da un altro sito Web per il proprio account.

Alcuni hash basati sulla sessione e il tempo potrebbero fare il trucco. Ovviamente, se l'utente copia il valore dal JS, può comunque eseguirlo da un'altra posizione, ma è possibile che tale valore scada ogni x minuti. Un'altra opzione è impostare un cookie con JS e leggerlo serveride.

Spero che questo ti dia alcune idee per iniziare.

1

Prima di tutto perché non utilizzare $ .post (url, dati, callback, 'json') al posto di getJSON? E come ha detto kleolb02, si può aggiungere valore dal cookie ai dati post utilizzando cookie plugin - {__RequestVerificationToken: $ .cookie ('__ RequestVerificationToken')}

+0

Questo suona bene. Speravo di evitare il POST per una semplice chiamata ajax, ma lo farò sicuramente se è l'unico modo per garantirlo. –

+0

È necessario utilizzare post per aggiornare alcuni dati sul server. Questo è uno scenario comune. E per quanto mi ricordo AntiForgeryToken sta lavorando solo con le richieste post (cercano solo un valore in FormCollection). – zihotki

+0

Questo non è un aggiornamento, è un semplice "get". Vorrei semplicemente limitare il consumo dell'URL alle chiamate AJAX della mia pagina. –

1

ho usato il codice simile a un progetto ASP.NET MVC da usare sulla funzione di sfocatura di un elemento senza avere un modulo Ajax. Questo codice fornisce il riempimento di un campo di testo con i dati del server quando si verifica un determinato evento HTML Evento sfocatura.

Spero che questo aiuti anche. Ecco il mio codice:

Javascript: codice

var mytext = { 'myText': 'example text' }; 
$.post('/MyController/JsonResultMethod', AddAntiForgeryToken(myText), function (resultData) { 
     $('#htmlElement').val(resultData); 
}); 
AddAntiForgeryToken = function (data) { 
    data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val(); 
    return data; 
}; 

C-Sharp:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public JsonResult SeoString(string myText) 
    { 
     try 
     { 
      // do something here 
      return this.Json("result text"); 
     } 
     catch (Exception) 
     { return this.Json(string.Empty); } 
    }