CodeIgniter impedisce automaticamente l'iniezione SQL?
-
06-07-2019 - |
Domanda
Ho appena ereditato un progetto perché l'ultimo sviluppatore se ne è andato. Il progetto è basato su Code Igniter. Non ho mai lavorato con Code Igniter prima.
Ho dato una rapida occhiata al codice e vedo le chiamate al database nel controller in questo modo:
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '". Ho appena ereditato un progetto perché l'ultimo sviluppatore se ne è andato. Il progetto è basato su Code Igniter. Non ho mai lavorato con Code Igniter prima.
Ho dato una rapida occhiata al codice e vedo le chiamate al database nel controller in questo modo:
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");
o chiamate in questo modo:
<*>
L'accenditore di codici sanifica automaticamente queste query per impedire l'iniezione sql?
POST['user_name']."'");
o chiamate in questo modo:
<*>L'accenditore di codici sanifica automaticamente queste query per impedire l'iniezione sql?
Soluzione
CodeIgniter ESCAPE le variabili che passi quando usi il metodo $ this- > db- > query
. Ma SOLO quando passi le variabili come bind, ecco un esempio:
$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));
Ricorda inoltre che $ _POST
non dovrebbe essere preferito su $ this- > input- > post
poiché ciò che fa è controllare se esistono le variabili per impedire errori.
Altri suggerimenti
CodeIgniter fornisce alcune funzioni di escape della stringa nel suo livello di database.
Estratto da Manuale CI :
È un'ottima pratica di sicurezza evitare i dati prima di inviarli nel database. CodeIgniter ha tre metodi che ti aiutano a farlo:
$ this- > db- > escape () Questa funzione determina il tipo di dati in modo che possa sfuggire solo ai dati di stringa. Aggiunge inoltre automaticamente virgolette singole intorno ai dati, quindi non è necessario:
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
Pubblicherei gli altri due esempi, ma non vorrei togliermi tutto il divertimento dalla lettura del manuale.
No, il codice che hai pubblicato è suscettibile all'iniezione SQL. Per costruire le tue query SQL devi utilizzare associazione di query . Se stai utilizzando la libreria CI DB, la codificheresti in questo modo (esempio dalla guida per l'utente):
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
No, CodeIgniter non disinfetterà magicamente le query create in questo modo.
Secondo i documenti di CI qui , il framework filtra il POST sulla costruzione del controller. Facoltativamente, fa anche il filtro XSS chiamando manualmente la funzione o impostando una configurazione globale.
Non ho mai usato nemmeno CI, tranne che per giocarci, quindi non sono sicuro di quanto mi fiderei di ciò.
Questo non sfugge a nulla. È meglio cambiarlo nella sintassi di bind o nella sintassi del record attivo
Dovresti usare $ this- > input- > post, associazione di query e record attivo per avere i dati più sicuri e poi ancora test test test per sicurezza.
Usa la registrazione attiva per sicurezza e codifica più semplice:
Invece di:
$dbResult = $this->db->query("SELECT * FROM users WHERE username'". Usa la registrazione attiva per sicurezza e codifica più semplice:
Invece di:
$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');
Usa (stesso risultato):
<*>POST['user_name']."'");
Usa (stesso risultato):
<*>Potrebbe essere una seccatura ma dovresti convertire le tue query in record attivi.
Sto copiando dal manuale di CodeIgniter: " Al di là della semplicità, uno dei maggiori vantaggi dell'uso delle funzionalità Record attivo è che ti consente di creare applicazioni indipendenti dal database, poiché la sintassi della query viene generata da ciascun adattatore di database. Permette anche query più sicure, poiché i valori vengono salvati automaticamente dal sistema . "
E come alcune persone hanno già detto, sì, questo codice è suscettibile all'iniezione SQL
Ottimizzato con un secondo parametro post (TRUE) per filtrare XSS a livello di input:
$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');
I documenti per (almeno) 2.2 stato, in un grande scatola rossa:
Sebbene Active Record farà del suo meglio per citare correttamente tutti i nomi di campi e tabelle che lo alimentano, si noti che NON è progettato per funzionare con input utente arbitrario. NON alimentare con dati utente non autorizzati.
Che per questo programmatore significa " non fare affidamento su Active Record per citare nulla " ;.
Uso della funzione escape per l'iniezione di CI
<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>