Domanda

Sono meno vulnerabili all'iniezione SQL rispetto a fare cose come mysql_query (" SELEZIONARE important_data DAGLI utenti DOVE password = $ password ") ?

È stato utile?

Soluzione

Sono più sicuri di quello che stai facendo. La tua query pubblica SQL non elaborati nel db, il che significa che i tuoi parametri non sono trattati come parametri sql ma come semplici sql vecchi.

Ecco cosa intendo.

Con una procedura memorizzata, la variabile della password non può essere sql, deve essere un'informazione che il sistema sta cercando. Nel tuo esempio, ciò che viene effettivamente inviato al db è

SELEZIONA * DA Utente dove password = ('qui la tua password' - variabile $ Password) ..... così qualcuno può fare qualcosa del genere

SELEZIONA * DA utente DOVE Password = ('qui la tua password'; SELEZIONA * DA Utente - $ password variabile).

o peggio ancora:

SELEZIONA * DALL'UTENTE DOVE Password = ('qui la tua password'; DROP Database Database_Name - $ password variabile).

Una stored procedure sql non dinamica non lo consentirà, poiché il parametro di input non verrà eseguito come sql aggiuntivo.

SQL parametrizzato si occupa di questo, ma le procedure tecnicamente memorizzate sono ancora un po 'più sicure, perché l'utente che accede alle informazioni nella tabella non necessita dell'accesso in lettura. Deve solo essere in grado di eseguire la procedura memorizzata. A seconda delle tue necessità, ciò può o non può entrare in gioco.

Altri suggerimenti

Non necessariamente, potresti fare concatenazione di stringhe al suo interno e l'esposizione sarebbe la stessa. Se utilizzi sql dinamico con variabili di parametro (nessuna concatenazione di stringhe per produrre SQL), saresti abbastanza ben protetto.

Finché si utilizzano i parametri e non si utilizza la concatenazione di stringhe per i valori immessi dall'utente, non vi sarà alcun rischio di iniezione SQL. Le procedure memorizzate sono un po 'più "sicure" sotto questo aspetto, perché ti incoraggiano a usare i parametri. Ma se nella procedura fai qualcosa del genere

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password

Quindi tornerai al punto 1 e molto vulnerabile alle iniezioni di SQL.

Inoltre, esiste qualcosa come "dichiarazioni preparate" che non sono stored procedure, ma possono anche utilizzare parametri. Possono quindi essere utilizzati anche per evitare l'iniezione di SQL.

Non ci sono tecnologie sicure. Le tecnologie possono essere utilizzate solo in modi sicuri o non sicuri.

Detto questo, le procedure memorizzate richiedono una codifica leggermente più creativa per consentire l'iniezione di SQL, cosa che accade comunque. Nulla ti impedisce di concatenare stringhe in esse, in qualsiasi motore di database SQL di cui sono a conoscenza.

se sono parametrizzati correttamente e non stai eseguendo sql dinamico, allora sono più sicuri e trarrai vantaggio anche dal riutilizzo del piano di esecuzione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top