it-swarm.it

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

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 falsificare dove sarebbero autorizzati.

12
Daniel Bingham

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

Se desideri solo un semplice blocco di persone che chiamano non 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.

12
delete

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.

6
DisgruntledGoat

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'].

Source

3
theycallmemorty

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 una matrice dei 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
digit1001

Penso che un grosso pezzo della tua soluzione sarà limitazione della velocità traffico proveniente 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 X sessioni, per ogni richiesta di ajax il tuo JavaScript dovrà restituire quella chiave o ajax restituirà un errore. Quando la tua pagina raggiunge X+1 ajax chiama, imponi all'utente di eseguire alcune azioni (forse captcha? Forse anche qualcosa come un evento mousemove o tap a seconda della UA) prima di inviare una nuova sessione chiave giù 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. Come farlo dipende dal tipo di valori inviati dal cliente e dal tipo di malizia che un cattivo attore può fare inviando valori cattivi.

0
artlung