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?

È stato utile?

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:

     
      
  1. $ 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).")";
    
  2.   

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');

librerie / input.html

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);?>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top