Come posso impedire a un utente esperto di chiamare le mie funzioni Ajax?


12

Ho un sito che utilizza le chiamate Ajax per eseguire una serie di funzioni. Hanno il webbrowser che richiama uno script - ajax.php. Sebbene io usi i dati post per trasmettere i dati e limitare i comandi che lo script ajax può chiamare, non c'è davvero nulla che impedisce agli utenti di falsificare le chiamate ajax per tentare di manipolare il sito. Esiste un modo generale per impedire agli utenti di falsificare le chiamate? Esiste un modo per garantire che una chiamata Ajax provenga effettivamente dal mio sito Web e non da qualche altro script o sito?

O devo semplicemente controllare le condizioni al contorno nello script php e impedire agli utenti di falsificare cose che non avrebbero potuto fare, ma permetto loro di spoofare dove sarebbero autorizzati.


Le chiamate ajax sono completamente non autenticate? Crei sessioni per ciascuno? Ci sono schemi per l'abuso? Ed è la manipolazione specifica del problema o più la quantità di carico che aggiunge al sito?
artlung,

Puoi pubblicare più specifiche per favore? Cosa stanno facendo le chiamate AJAX? Cosa stanno manipolando? Quali problemi si verificano se lo script viene chiamato all'esterno di AJAX?
Sconcertato

Non sto davvero chiedendo una circostanza specifica, ma piuttosto una soluzione generale applicabile a molte circostanze. Se esiste una soluzione del genere, che non sembra ci sia.
Daniel Bingham,

Risposte:


12

Non credo che ci sia un modo per farlo in modo affidabile, poiché qualsiasi informazione che potresti inviare potrebbe essere falsificata, a seconda di quanto sia intelligente l'utente.

Se vuoi solo un semplice blocco di persone che non chiamano dalla tua pagina, puoi controllare il referrer, utilizzare un cookie o aggiungere un campo nascosto casuale inviato dalla pagina chiamante che scade dopo un certo tempo. Ma questi sono facili da falsificare se l'utente è veramente determinato.


2
+1 .. proprio come è impossibile impedire alle persone di salvare copie locali di qualsiasi cosa venga visualizzato sul loro browser. È più una gara per vedere se riesci a farli rinunciare e passare a qualcos'altro prima che lo capiscano.
Tim Post

6

In breve, no. Qualsiasi richiesta fatta a un URL tramite GET o POST può essere fatta da chiunque utilizzi qualsiasi software. In realtà, una richiesta AJAX non è in realtà diversa dal caricamento diretto dell'URL, tranne per il fatto che i dati restituiti vengono visualizzati nel browser come una pagina Web.

Questo è esattamente il motivo per cui dovresti sempre convalidare i dati inviati sul server, indipendentemente dal fatto che tu esegua o meno una convalida Javascript.

Non è chiaro esattamente cosa stia facendo lo script sul lato server e cosa potrebbe andare storto, ma se gli utenti sono in grado di "manipolare il sito" chiamando lo script con dati errati, You Are Doing It Wrong.

Probabilmente la soluzione migliore sarà quella di introdurre una qualche forma di autenticazione.


3

Quindi sostanzialmente vuoi limitare ajax.php a rispondere solo alle richieste AJAX?

Non sono un esperto di php, ma sembra che sia possibile determinare se una determinata richiesta proviene da AJAX o una richiesta "normale" del browser controllando il valore di $_SERVER['HTTP_X_REQUESTED_WITH'].

fonte


2
buon punto, supponendo che l'abusatore non usi ajax o forgia quell'intestazione HTTP
Adam,

1

Come ha sottolineato qualcun altro ... le chiamate ajax sono solo ricevitori di $ _GET o $ _POST, quindi il mio approccio è sempre stato quello di trattarle come farei qualsiasi pagina di azione e filtrare / disinfettare l'input. Se hai una piccola variazione di quello che ti aspetti, ad esempio un mese, e sai che è sempre nel formato "Jan, Feb, Mar ...", puoi impostare un array di valori previsti e filtrare in base a esso. Intrappola tutto ciò che non corrisponde e opzionalmente getta qualcosa come "Bzzt ... grazie per aver giocato ..."

Non riesco a pensare a un esempio in cui il mio script Ajax dovrebbe essere più sicuro di un modulo inviato.

HTH


+1 per "Bzzt" - che diventa molto più divertente nel contesto di "Bzzt - grazie per aver giocato!" seguito da una lenta dissolvenza verso il nero accompagnata da un divieto di tre ore imposto da un cookie impostato sul computer dell'utente (sono sicuro che avrebbero ricevuto il messaggio)
danlefree

0

Penso che un grosso pezzo della tua soluzione sarà limitare il traffico da un'impronta digitale specifica dell'utente. Forse un hash di indirizzo IP, stringa User Agent e dati inviati.

Inoltre, può essere utile associare la pagina che chiama ajax ai dati restituiti da ajax. Quindi nella pagina in questione, al caricamento della pagina invia una chiave di sessione che è buona per le Xsessioni, per ogni richiesta di Ajax il tuo JavaScript dovrà passare quella chiave o Ajax restituirà un errore. Una volta che la tua pagina raggiunge le X+1chiamate ajax, costringi l'utente a fare qualche azione (forse captcha? Forse anche qualcosa come un mousemoveo un tapevento a seconda della UA) prima di inviare una nuova chiave di sessione lungo il filo (fuori banda dall'ajax originale), quindi riavviare il processo.

Anche se, a mio avviso, è possibile che forse una parte del tuo problema sia la validazione lassista dei parametri inviati. Se le persone possono semplicemente giocare con i parametri inviati e recuperare dati validi, allora è più difficile farlo. Il modo in cui farlo dipende dal tipo di valori inviati dal cliente e dal tipo di malizia che un cattivo attore può fare inviando valori negativi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.