Domanda

In CodeIgniter, come posso evitare l'iniezione di SQL? Esiste un metodo da impostare nel file di configurazione per evitare l'iniezione SQL? Sto usando questo codice per selezionare i valori:

$this->db->query("SELECT * FROM tablename WHERE var='$val1'");

E questo per l'inserimento di valori:

$this->db->query("INSERT INTO  tablename (`var1`,`var2`) VALUES ('$val1','$val2')");

Un altro metodo utilizzato per inserire e selezionare i valori dal database è quello di codeigniter insert() e get() metodi. È ogni possibilità di iniezione di SQL durante l'utilizzo delle funzioni bulit-in di CodeIgniter

È stato utile?

Soluzione

CodeIgniter's Record attivo I metodi sfuggono automaticamente alle query per te, per prevenire l'iniezione di SQL.

$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();

o

$this->db->insert('tablename', array('var1'=>$val1, 'var2'=>$val2));

Se non si desidera utilizzare i record attivi, puoi usare attacchi di query prevenire contro l'iniezione.

$sql = 'SELECT * FROM tablename WHERE var = ?';
$this->db->query($sql, array($val1));

O per l'inserimento puoi usare il insert_string() metodo.

$sql = $this->db->insert_string('tablename', array('var1'=>$val1, 'var2'=>$val2));
$this->db->query($sql);

C'è anche il escape() Metodo se preferisci eseguire le tue domande.

$val1 = $this->db->escape($val1);
$this->db->query("SELECT * FROM tablename WHERE var=$val1");

Altri suggerimenti

Puoi usare

$this->db->escape()

metodo..

$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($omgomg).")";

Altri metodi sono elencati qui.

http://codeigniter.com/user_guide/database/queries.html

Dovresti provare a evitare di scrivere le tue query direttamente in una stringa e quindi passarle alla funzione di query. Un'opzione migliore sarebbe quella di utilizzare la classe di record attiva che costruirà le tue domande per te e sfuggirà ai valori. http://codeigniter.com/user_guide/database/active_record.html

Se si desidera evitare di utilizzare la classe di record attiva per qualsiasi motivo, è possibile visualizzare la documentazione di codeigniter per la classe di database che ha un metodo di fuga per sfuggire ai valori prima di passarli al metodo di query. http://www.codeigntor.com/user_guide/database/queries.html

Ben

In CodeIgniter: ci sono 2 azioni per prevenire l'iniezione di SQL. Per coloro che sono novità nella programmazione web, un altro tipo di foro di sicurezza nella programmazione web che può essere fatale perché può esporre il lato interno del database dell'applicazione, è iniezione SQL.

E per fortuna, CodeIgniter ha la capacità di affrontarlo. Ma sfortunatamente, molti programmi di CI che ho collaborato (e persino te) hanno (o potrei) dimenticarono questa azione per impedire qualsiasi circostanza di iniezione di SQL.

Attacca con la funzionalità ActiveCord La prima cosa non è in nessuna circostanza che si tratta di interrogare i dati utilizzando una query completa come questa:

$this->db->query("select * from users where user=$user and password=$password")

Non sai cosa esattamente dentro $ utente o $ password variabile quando si tratta di utente che farà deliberatamente la cosa sbagliata. Anche XSS Sanitiser non si occuperà di qualcuno che inserisce la combinazione di citazione, semilo o carattere di cruscotto. Quindi, in questo caso, è necessario imparare questa cosa di record attiva perché ha una capacità di sanitiser input dedicata per prevenire l'iniezione di SQL. E non preoccuparti, supporta un tipo di incatenamento delle funzioni in questo modo:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);

$query = $this->db->get();

Ma ricorda, non funzionerà se si combina ancora la solita funzione di query (parzialmente) all'interno della funzione di record attiva come questa:

$query = $this->db->where("title LIKE '%$input%'");

Che in realtà potrebbe essere cambiato in questo modo.

$query = $this->db->like("title", $input);

Il punto è che usa ogni bit di possibilità del record attivo di CodeIgniter e non scherzando.

Ma se questo non funziona, c'è un'alternativa se hai una domanda molto lunga e non ti preoccupi di convertirlo in stile di record attivo, puoi disinfettare manualmente il tuo input usando questa funzione:

$sanitised_title = $this->db->escape($title);

// per l'uso all'interno di come query

$sanitised_title = $this->db->escape_like_str($title);

E puoi concatenare in modo sicuro l'input sanificato/sfuggito all'interno della tua query.

Puoi verificare se si contengono solo lettere di numeri, il che significa che il Var Mast sii in formato definito. Prima di inserirlo nella query

Accettando il valore dal lato client, è meglio utilizzare questo codice,

$client = $this->input->post('client',TRUE);

Mentre si inserisce meglio per utilizzare il metodo di inserimento di codeigniter,

$this->db->insert('tablename',$values);

Quando si utilizza questo metodo CodeingNiter, eseguire automaticamente tutti, quindi non abbiamo bisogno di Escape Manual.

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