Comment éviter l'injection sql dans codeigniter

Dans CodeIgniter, Comment puis-je éviter l'injection sql? Existe-t-il une méthode à définir dans le fichier de configuration pour éviter l'injection sql? J'utilise ce code pour sélectionner des valeurs:

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

Et ceci pour insérer des valeurs:

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

Une autre méthode utilisée pour insérer et sélectionner des valeurs dans la base de données est les méthodes insert() et get() de CodeIgniter. Est-ce une chance d'injection sql tout en utilisant les fonctions bulit-in de CodeIgniter

26
demandé sur Francisco Alvarado 2011-05-02 16:55:26

6 réponses

Les méthodesActive Record de CodeIgniter échappent automatiquement aux requêtes pour vous, afin d'empêcher l'injection sql.

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

Ou

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

Si vous ne souhaitez pas utiliser les Enregistrements Actifs, vous pouvez utiliser liaisons de requête pour prévenir contre les injections.

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

Ou pour l'insertion, vous pouvez utiliser le insert_string() méthode.

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

, Il est également le escape() méthode si vous préférez exécuter vos propres requêtes.

$val1 = $this->db->escape($val1);
$this->db->query("SELECT * FROM tablename WHERE var=$val1");
48
répondu Rocket Hazmat 2018-02-01 14:45:54

Vous pouvez utiliser

$this->db->escape()

Méthode..

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

D'autres méthodes sont listées ici.

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

6
répondu Vamsi Krishna B 2011-05-02 13:08:21

, Vous devriez essayer d'éviter d'écrire vos requêtes directement dans une chaîne, puis les passer à la fonction de requête. Une meilleure option serait d'utiliser la classe Active Record qui construira vos requêtes pour vous et échappera aux valeurs. http://codeigniter.com/user_guide/database/active_record.html

Si vous voulez éviter d'utiliser la classe Active Record pour une raison quelconque, vous pouvez afficher la documentation Codeigniter pour la classe de base de données qui a une méthode d'échappement pour échapper vos valeurs avant de les transmettre à la méthode de requête. http://www.codeignitor.com/user_guide/database/queries.html

Ben

3
répondu Ben 2011-05-02 13:14:57

Dans CodeIgniter: Il y a 2 actions pour empêcher L'Injection SQL. Pour ceux qui sont la nouveauté dans la programmation web, un autre type de trou de sécurité dans la programmation web qui peut être fatale car elle peut exposer votre côté intérieur de la base de données de l'application, c'est L'Injection SQL.

Et heureusement encore une fois, Codeigniter a la capacité d'y faire face. Mais malheureusement, beaucoup de CI programmeur j'ai collaboré (et même vous) a fait (ou pourrait) oublier ces deux actions pour empêcher toute circonstance de SQL injection.

Bâton avec ActiveRecord capacité La première chose est de ne pas en aucun cas traiter l'interrogation des données en utilisant une requête complète comme ceci:

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

Vous ne savez pas exactement quoi à l'intérieur$user ou $password variable quand il s'agit d'un utilisateur qui fera délibérément la mauvaise chose. Même XSS sanitiser ne traitera pas avec quelqu'un qui entre une combinaison de guillemets, de points-virgules ou de caractères de tiret. Donc, dans ce cas, vous devez apprendre cette chose D'enregistrement actif parce qu'il a une capacité d'assainissement d'entrée dédiée à empêcher L'injection SQL. Et ne vous inquiétez pas, il supporte le type de chaînage de fonction comme ceci:

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

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

Mais rappelez-vous, cela ne fonctionnera pas si vous combinez toujours la fonction de requête habituelle (partiellement) à l'intérieur de la fonction d'enregistrement active comme ceci:

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

Qui pourrait en fait être changé comme ça.

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

Le fait est, Utilisez chaque bit de possibilité de L'enregistrement actif de CodeIgniter et ne jouez pas avec.

Mais si cela n'est-ce pas le travail, il y a une alternative Si vous avez une requête très longue et que vous ne vous embêtez pas à la convertir en style D'enregistrement actif, vous pouvez assainir votre entrée manuellement en utilisant cette fonction:

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

/ / pour une utilisation à L'intérieur comme requête

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

Et vous pouvez concaténer en toute sécurité l'entrée aseptisée / échappée dans votre requête.

1
répondu user5751226 2016-01-06 08:36:48

Vous pouvez vérifier si vous var ne contiennent que des lettres de chiffres, ce qui signifie que vous var mât être dans votre format défini. avant de l'insérer dans la requête

0
répondu Mark T 2011-05-02 13:05:13

Tout en acceptant la valeur du côté client, mieux vaut utiliser ce code,

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

Lors de l'insertion, il est préférable d'utiliser la méthode d'insertion codeigniter,

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

Lors de l'utilisation de cette méthode codeingniter automatiquement faire tous échapper donc nous n'avons pas besoin de faire échapper manuel.

0
répondu shihabudheen 2012-09-18 13:35:13