• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Problema risolto Sicurezza del jQuery

Stato
Discussione chiusa ad ulteriori risposte.

Tapatalk

Utente Esperto
Autore del topic
28 Agosto 2013
1.315
83
Miglior risposta
3
Salve a tutti!
Non credevate che sarei tornato a fare una qualche domanda, eh? Ebbene, mi è sorto un dubbio che non riesco a capire.

Mi spiego: sto creando una semplice pagina di Login, il problema non è questo, anzi funziona alla perfezione. Quello che voglio fare è semplicemente controllare che i campi si possano riempire senza dover ricaricare la pagina, ovvero con il jQuery. E anche questo l'ho fatto: ho creato diverse funzioni che sostanzialmente fanno il seguente ragionamento.
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
A questo punto, se tutto il form non riporta errori, allora posso inviarlo (submit) ed il file PHP avrà il solo compito di inserire i dati nel Database.

Ora, la mia domanda è questa: è possibile che con Ispeziona Elemento un utente possa "ingannare" il codice jQuery? Ad esempio facendo risultare nel codice nessun errore, quando magari l'username è già occupato? Perché sostanzialmente, quello che vorrei fare sarebbe togliere dal file PHP ogni tipo di controllo (della serie "se esiste riporta l'errore"), lasciando alla funzione jQuery questo compito. Il file PHP dovrebbe solo avere una funzione di invio dati al database.

Spero di essermi spiegato. In caso, ringrazio chi mi risponderà.
 
Potresti inserire a input l'attributo required.
Tramite Ispeziona elemento è possibile cancellare questo attributo e inviare il form con errori. Potresti risolvere in questo modo tramite PHP:

PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
Purtroppo in questo modo la pagina dovrà ricaricarsi di sicuro. Credo che inserendo script JS l'utente può sempre manomettere il codice e saltare il controllo visto che si tratta pur sempre di un linguaggio lato client..

Ciao!
 
Da parzialmente ignorante su questo lato delle cose, ti risponderei che sì, può darsi che sia possibile "ingannare" jQuery e Javascript lato client in generale, anche se non so quanto facile sia.

Quello che mi sento di consigliarti è che comunque PHP deve controllare la validità delle azioni eseguite dagli utenti e la validità delle cose inserite in una form, perché la prudenza non è mai troppa! Potrebbero esserci mille altri modi di bypassare jQuery che magari noi non conosciamo ma qualcun altro sì, ragione per cui cerca di essere quanto più difensivo possibile nella tua programmazione e non te ne pentirai. E poi perché vorresti eliminare tutti i controlli dal PHP?
 
  • Like
Reactions: Cristoforo58
Potresti inserire a input l'attributo required.
Tramite Ispeziona elemento è possibile cancellare questo attributo e inviare il form con errori. Potresti risolvere in questo modo tramite PHP:

PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
Purtroppo in questo modo la pagina dovrà ricaricarsi di sicuro. Credo che inserendo script JS l'utente può sempre manomettere il codice e saltare il controllo visto che si tratta pur sempre di un linguaggio lato client..

Ciao!
In realtà il campo required c'è già, ma anche con il jQuery controllo se il campo è vuoto.
Da parzialmente ignorante su questo lato delle cose, ti risponderei che sì, può darsi che sia possibile "ingannare" jQuery e Javascript lato client in generale, anche se non so quanto facile sia.

Quello che mi sento di consigliarti è che comunque PHP deve controllare la validità delle azioni eseguite dagli utenti e la validità delle cose inserite in una form, perché la prudenza non è mai troppa! Potrebbero esserci mille altri modi di bypassare jQuery che magari noi non conosciamo ma qualcun altro sì, ragione per cui cerca di essere quanto più difensivo possibile nella tua programmazione e non te ne pentirai. E poi perché vorresti eliminare tutti i controlli dal PHP?
In realtà volevo rendere più libero il file PHP, semplicemente perché tramite la funzione jQuery (ajax.POST) controllo già con un altro file PHP se i campi sono validi. Questo file PHP se dà risposta positiva fa procedere il form, in caso contrario lo ferma. Tuttavia, come tu mi hai detto (e come immaginavo) è possibile in qualche modo ingannare il codice, facendo credere che indipendentemente dalla risposta data dal file PHP, la funzione possa procedere.
Spero ancora una volta di essermi spiegato...

Se nessun altro sa darmi una risposta differente, allora direi che il mio dubbio è stato risolto.
Grazie ad entrambi :emoji_slight_smile:
 
Da parzialmente ignorante su questo lato delle cose, ti risponderei che sì, può darsi che sia possibile "ingannare" jQuery e Javascript lato client in generale, anche se non so quanto facile sia.

Quello che mi sento di consigliarti è che comunque PHP deve controllare la validità delle azioni eseguite dagli utenti e la validità delle cose inserite in una form, perché la prudenza non è mai troppa! Potrebbero esserci mille altri modi di bypassare jQuery che magari noi non conosciamo ma qualcun altro sì, ragione per cui cerca di essere quanto più difensivo possibile nella tua programmazione e non te ne pentirai. E poi perché vorresti eliminare tutti i controlli dal PHP?
In realtà volevo rendere più libero il file PHP, semplicemente perché tramite la funzione jQuery (ajax.POST) controllo già con un altro file PHP se i campi sono validi. Questo file PHP se dà risposta positiva fa procedere il form, in caso contrario lo ferma. Tuttavia, come tu mi hai detto (e come immaginavo) è possibile in qualche modo ingannare il codice, facendo credere che indipendentemente dalla risposta data dal file PHP, la funzione possa procedere.
Spero ancora una volta di essermi spiegato...

Se nessun altro sa darmi una risposta differente, allora direi che il mio dubbio è stato risolto.
Grazie ad entrambi :emoji_slight_smile:
Personalmente credo che sia sbagliata l'organizzazione di fondo (a meno di particolari tue necessità): dovresti avere un solo file che controlla e che inserisce i dati. Ad esempio un file ajax.php che è un grande switch() su $_POST['action']: se questo è check allora fai il controllo, se questo è submit allora invii i dati al DB e controlli che non esista già eccetera. In questo modo puoi anche metterti al riparo più facilmente da attacchi che cambiano il JS inventandosi di fare azioni che non esistono (tramite il default nello switch() per esempio). Resta comunque valido il fatto che anche in fase di submit dovresti controllare la validità dei campi, perché tanto se c'è qualche falla nel tuo codice prima o poi verrà trovata, quindi tu difenditi il più possibile in anticipo. ;)
 
  • Like
Reactions: Lex007
Da parzialmente ignorante su questo lato delle cose, ti risponderei che sì, può darsi che sia possibile "ingannare" jQuery e Javascript lato client in generale, anche se non so quanto facile sia.

Quello che mi sento di consigliarti è che comunque PHP deve controllare la validità delle azioni eseguite dagli utenti e la validità delle cose inserite in una form, perché la prudenza non è mai troppa! Potrebbero esserci mille altri modi di bypassare jQuery che magari noi non conosciamo ma qualcun altro sì, ragione per cui cerca di essere quanto più difensivo possibile nella tua programmazione e non te ne pentirai. E poi perché vorresti eliminare tutti i controlli dal PHP?
In realtà volevo rendere più libero il file PHP, semplicemente perché tramite la funzione jQuery (ajax.POST) controllo già con un altro file PHP se i campi sono validi. Questo file PHP se dà risposta positiva fa procedere il form, in caso contrario lo ferma. Tuttavia, come tu mi hai detto (e come immaginavo) è possibile in qualche modo ingannare il codice, facendo credere che indipendentemente dalla risposta data dal file PHP, la funzione possa procedere.
Spero ancora una volta di essermi spiegato...

Se nessun altro sa darmi una risposta differente, allora direi che il mio dubbio è stato risolto.
Grazie ad entrambi :emoji_slight_smile:
Personalmente credo che sia sbagliata l'organizzazione di fondo (a meno di particolari tue necessità): dovresti avere un solo file che controlla e che inserisce i dati. Ad esempio un file ajax.php che è un grande switch() su $_POST['action']: se questo è check allora fai il controllo, se questo è submit allora invii i dati al DB e controlli che non esista già eccetera. In questo modo puoi anche metterti al riparo più facilmente da attacchi che cambiano il JS inventandosi di fare azioni che non esistono (tramite il default nello switch() per esempio). Resta comunque valido il fatto che anche in fase di submit dovresti controllare la validità dei campi, perché tanto se c'è qualche falla nel tuo codice prima o poi verrà trovata, quindi tu difenditi il più possibile in anticipo. ;)
Diciamo che è più per necessità, nel senso che il file di inserimento dati è incluso nella pagina del login, ma procede solo se il form viene inviato, quindi ad una risposta positiva del codice jQuery. Mi risulterebbe scomodo (personalmente), anche se comprendo come effettivamente sia più vantaggioso dividere tutto in un solo file.
 
In rete ho trovato un metodo per limitare l'accesso al file JS. Ciò non toglie che un utente più esperto possa decifrare il file e agirci contro ma avere una misura di sicurezza in più credo che non faccia mai male. L'articolo è in lingua inglese:
Perfavore, Entra oppure Registrati per vedere i Link!
 
Salve a tutti!
Non credevate che sarei tornato a fare una qualche domanda, eh? Ebbene, mi è sorto un dubbio che non riesco a capire.

Mi spiego: sto creando una semplice pagina di Login, il problema non è questo, anzi funziona alla perfezione. Quello che voglio fare è semplicemente controllare che i campi si possano riempire senza dover ricaricare la pagina, ovvero con il jQuery. E anche questo l'ho fatto: ho creato diverse funzioni che sostanzialmente fanno il seguente ragionamento.
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
A questo punto, se tutto il form non riporta errori, allora posso inviarlo (submit) ed il file PHP avrà il solo compito di inserire i dati nel Database.

Ora, la mia domanda è questa: è possibile che con Ispeziona Elemento un utente possa "ingannare" il codice jQuery? Ad esempio facendo risultare nel codice nessun errore, quando magari l'username è già occupato? Perché sostanzialmente, quello che vorrei fare sarebbe togliere dal file PHP ogni tipo di controllo (della serie "se esiste riporta l'errore"), lasciando alla funzione jQuery questo compito. Il file PHP dovrebbe solo avere una funzione di invio dati al database.

Spero di essermi spiegato. In caso, ringrazio chi mi risponderà.


tutti i possibili controlli front-end sono bypassabili , ad esempio mettendo in debug lo stesso stato "success" di ajax e modificare i dati che ha ricevuto come risposta.
Ovviamente il controllo più robusto va fatto al submit del form vero e proprio , quindi quando invii il form comunque ricontrolli che quel utente non esiste già , quindi il file non può avere solo la funzione di invio dati al db
 
  • Like
Reactions: Lex007
Quoto TBH TBH .
Ci tengo anche a farti notare che non è complicato inviare richieste POST a determinate pagine hostate sul tuo sito senza passare dal sito stesso, quindi un utente un po' più smanettone (tipo me :emoji_smile:) potrebbe tranquillamente divertirsi a fare submit potenzialmente illimitati bypassando tutti i controlli.
Un consiglio, inserisci i controlli lato PHP e organizza bene il database se vuoi evitare problemi.
Il campo username può essere tranquillamente definito come campo "chiave", il che limiterebbe la possibilità di inserire due utenti con lo stesso nome.
 
  • Like
Reactions: Tapatalk
ajax e gestisci tutto lato backend. Mai fare controlli simili con frontend perché non ci vuole molto a bypassare controlli simili. E non parlo solo di questo, ma anche di determinati validator tipo "obbligo di inserire un determinato campo" o lunghezza minima della password et similia.
 
  • Like
Reactions: Lex007
Stato
Discussione chiusa ad ulteriori risposte.