Tutto ciò che devi fare è generare un segreto (token) al caricamento della pagina. Mettilo sulla pagina e in sessione. Tipicamente lo metto sotto forma di campo nascosto se posso, o se fa parte di una pagina molto più grande ajaxy, lo inserirò in un attributo value su un elemento correlato come il div che avvolge l'intera pagina. Altri aggiungeranno un tag script con una variabile impostata sul segreto.
Quindi, ogni volta che si effettua una chiamata AJAX o si invia il modulo, si include un campo per il segreto. (La risposta di Cheekysoft va più nel dettaglio su come fare questo con JS non elaborato, può essere fatto grosso modo lo stesso con jQuery o qualsiasi altro framework che potresti usare.) Abbinalo al valore della sessione sul back-end per assicurarti che siano ancora lo stesso (venuto dalla stessa fonte), e tu sei buono.
Se si desidera aumentare la sicurezza, rigenerare il segreto su ogni richiesta e restituire il nuovo segreto insieme ai dati richiesti. Tutte le richieste Ajax sostituiscono quell'attributo di campo o valore nascosto con il nuovo valore. Ciò non funziona in modo corretto se si eseguono molte richieste o richieste simultanee. In realtà, generarne uno ogni volta che viene caricata l'intera pagina dovrebbe essere sufficiente se lo fai su HTTPS, che dovresti essere.
Se non lo fai su HTTPS, non importa, qualcuno seduto in un internet cafè/starbucks può semplicemente rubare la sessione e ricaricare la pagina.
Se si sta andando a fare questo molto, vale la pena controllare jQuery e various plugins che ti aiuteranno a fare la protezione CSRF per te. Also, my way isn't the only way.
Grazie per la risposta. Se lo invio come intestazione della richiesta come per uno dei tuoi collegamenti: 'var csrf_token = ' = $ Ajaxtoken_value?>'; $ ("corpo"). Bind ("ajaxSend", la funzione (olmo, XHR, s) { \t se (s.type == "POST") { xhr.setRequestHeader ('X-CSRF-token' , csrf_token); } }); ' Come verifico il lato ajax? dovrei ritirare il token usando una richiesta di posta? – Anonymous
@Anonimo, dipenderà dalla tua lingua preferita. Sembra PHP, quindi controllerei qualcosa come [getallheaders] (http://php.net/manual/en/function.getallheaders.php) – DampeS8N
Ho capito come controllarlo: 'if ($ _ SERVER ['HTTP_X_CSRF_TOKEN'] == $ _SESSION ['ajaxtoken_value']) {' grazie. l'unico problema è che la richiesta è su http. come modifico le mie impostazioni in modo che la richiesta venga eseguita su https? – Anonymous