È possibile modificare il codice client jQuery per chiamare un'API remota in modo non voluto?

3

È possibile che qualcuno modifichi il codice JQuery di una pagina remota e faccia in modo che chiami le API remote in un modo diverso da quello previsto?

Supponiamo che il sito www.domain.com abbia uno script jquery.js che chiama sempre un'API su domain.com passando un nome e un cognome:

domain.com/api?name=bla&surname=blo

ora è possibile per qualcuno modificare il jQuery dal browser con qualcosa come Firebug e chiamare l'API senza nome e cognome per esempio e ottenere così un intero elenco di persone senza filtro:

domain.com/api?name=&surname=

Naturalmente potrei verificare nella mia API che siano presenti i due parametri, ma suppongo di non avere modo di modificare il programma dell'API di ascolto.

Il mio script jQuery potrebbe controllare il dominio da cui viene eseguito lo script? ad esempio se qualcuno ha salvato il mio file jQuery localmente e l'ha eseguito, sarebbe simile all'API remota come se il jQuery fosse stato eseguito dalla pagina Web desiderata su www.domain.com?

La mia idea è che uno script jQuery venga sempre eseguito "localmente" sia che venga scaricato dalla pagina desiderata o da una versione modificata, tuttavia alcuni siti sembrano essere in grado di consentire a un'API di essere chiamata solo dallo script previsto.

    
posta sarah.ferguson 13.01.2016 - 16:05
fonte

3 risposte

4

Non puoi fare affidamento su alcuna protezione dalle modifiche nel codice lato client, puoi solo fare del tuo meglio per prevenirli (es. XSS e CSRF). Chiunque può eseguire codice JavaScript arbitrario su una pagina come se fosse eseguito da quella stessa pagina.

Modifica :

Ad esempio, se stai utilizzando un browser desktop moderno come Chrome, fai clic con il pulsante destro del mouse su questa pagina corrente, quindi fai clic sull'opzione per "Ispezionare" l'elemento. Dovrebbe apparire una finestra secondaria che evidenzierà l'elemento di tua scelta. Noterai che puoi modificare direttamente parte dell'HTML sulla pagina attraverso questa interfaccia. Inoltre, ci sarà una scheda della console (insieme ad altre utili schede di debug). Se vai alla scheda della console, ti verrà data una schermata in cui puoi eseguire direttamente JS nel contesto della pagina che stai visualizzando. Se hai un elemento selezionato nella scheda Elementi, puoi modificare lo sfondo di quell'elemento eseguendo il seguente codice JS:

$0.style.background='yellow'

È possibile utilizzare più righe (Shift + Invio) o il contenuto di un intero file JS può essere copiato e incollato direttamente nella pagina utilizzando questa finestra della console. Probabilmente noterai anche durante l'utilizzo che ha una funzione simile al completamento automatico. Ciò semplifica il test e il debug del codice JS.

È anche tecnicamente possibile che la richiesta venga semplicemente cambiata in transito da un'estensione del browser installata o da un man-in-the-middle, o che la richiesta possa essere fatta utilizzando un codice JS completamente diverso che viene iniettato. Quindi, in pratica, l'unica scommessa sicura è quella di eseguire tutti i necessari interventi di risanamento sul lato server e solo di farlo ulteriormente sul lato client a vantaggio dell'esperienza utente.

Speriamo che questo esaurientemente risponda alla domanda.

    
risposta data 13.01.2016 - 16:09
fonte
1

Qualcuno non ha nemmeno bisogno di modificare il JavaScript - potrebbe semplicemente effettuare una richiesta direttamente all'API nel proprio browser web.

La maggior parte dei siti che limitano le API lo fanno avendo una qualche forma di autenticazione - questa potrebbe essere un'intestazione che lo script imposta contenente un valore che è stato precedentemente fornito dall'API. Anche allora, però, altri script potrebbero chiamare la stessa richiesta e fornire la stessa intestazione, e non ci sarebbe alcun modo per il server di determinare che questo non era un uso intenzionale dell'API.

Questo non è specifico per le API: il server sa solo quali informazioni fornisce il client e il client può sempre mentire. Ci sono modi per rendere la menzogna difficile, ad esempio, rafforzando i controlli dei certificati client, che consentirebbero al server di verificare che il client abbia una conoscenza attesa (una chiave privata specifica del client), ma anche questo non può dimostrare server che è un client specifico (se qualcuno ha copiato la chiave privata specifica del client, potrebbe essere mascherato come il client previsto - dal punto di vista del server, sono identici).

    
risposta data 13.01.2016 - 16:54
fonte
0

Sì, può trattarsi di un exploit di riferimento diretto agli oggetti o persino di un'iniezione XSS.

Ecco un esempio. Supponiamo che jQuery ajax esegua le seguenti operazioni:

DeleteUserById(100);

Che cosa succede se modifichi questo valore utilizzando un plug-in di Firefox come TamperData o modificandolo tramite la console per sviluppatori?

DeleteUserById(1);

Hai invece eliminato il primo utente. È quindi possibile eliminare ogni singolo utente nel database. Puoi modificare qualsiasi comando inviato dal client in tutto JavaScript.

Questo è il motivo per cui tutta la sicurezza deve essere fatta lato server, non lato client. Qualsiasi controllo effettuato sul lato client è a vantaggio dell'esperienza utente.

Per quanto riguarda il tuo esempio, dipende dal modo in cui sono stati programmati dagli sviluppatori.

    
risposta data 13.01.2016 - 21:41
fonte

Leggi altre domande sui tag