web-dev-qa-db-fra.com

comment éviter l'injection sql dans codeigniter

Dans CodeIgniter, comment é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. Y a-t-il une chance de faire une injection SQL lors de l'utilisation des fonctions intégrées de CodeIgniter

31
user667030

Les méthodes Active Record de CodeIgniter échappent automatiquement aux requêtes pour vous, afin d'éviter 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 éviter toute injection.

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

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

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

Il existe également la méthode escape() 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");
59
Rocket Hazmat

vous pouvez utiliser

$this->db->escape()

méthode..

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

d'autres méthodes sont répertoriées ici.

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

6
Vamsi Krishna B

Vous devez essayer d'éviter d'écrire vos requêtes directement dans une chaîne, puis de les transmettre à 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 souhaitez é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 dispose d'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
Ben

Dans CodeIgniter: il existe 2 actions pour empêcher l'injection SQL. Pour ceux qui sont novices dans la programmation Web, un autre type de faille de sécurité dans la programmation Web qui peut être fatal car il peut exposer votre côté interne de la base de données de l'application, c'est SQL Injection.

Et heureusement encore, Codeigniter a la capacité de s'en occuper. Mais malheureusement, beaucoup de programmeurs CI avec lesquels j'ai collaboré (et même vous) ont (ou pourraient) oublier ces deux actions pour éviter toute circonstance d'injection SQL.

Rester fidèle à la capacité ActiveRecord La première chose à faire est de ne jamais traiter les requêtes de données en utilisant une requête complète comme celle-ci:

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

Vous ne savez pas exactement ce qui se trouve à l'intérieur de la variable $ user ou $ password lorsqu'il s'agit d'un utilisateur qui fera délibérément la mauvaise chose. Même l'assainisseur XSS ne traitera pas avec quelqu'un qui y entrera une combinaison de guillemets, de points-virgules ou de tirets. Donc, dans ce cas, vous devez apprendre cette chose Active Record car elle a une capacité de filtrage d'entrée dédiée à empêcher l'injection SQL. Et ne vous inquiétez pas, il prend en charge un type de chaînage de fonctions comme celui-ci:

$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 continuez à combiner 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%'");

Ce qui pourrait en fait être changé comme ça.

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

Le fait est d'utiliser toutes les possibilités de l'enregistrement actif de CodeIgniter et de ne pas jouer avec.

Mais si cela ne fonctionne pas, il existe une alternative.Si vous avez une très longue requête et ne vous embêtez pas à la convertir en style Active Record, vous pouvez purifier votre entrée manuellement en utilisant cette fonction:

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

// À utiliser dans la requête LIKE

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

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

1
user5751226

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

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

Tout en insérant mieux pour utiliser la méthode d'insertion de codeigniter,

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

Lorsque vous utilisez cette méthode, le codeingniter fait automatiquement tous les échappements, nous n'avons donc pas besoin de les échapper manuellement.

0
shihabudheen

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

0
Mark T