Question

En CodeIgniter, comment puis-je éviter l'injection sql? Y at-il méthode pour définir dans le fichier config pour éviter une 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 à partir de la base de données est des méthodes de insert() de CodeIgniter et get(). Est-ce une chance d'injection sql lors de l'utilisation Bulit-in CodeIgniter fonctions

Était-ce utile?

La solution

Active Record méthodes échapper automatiquement les requêtes pour vous, pour é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 Active Records, vous pouvez utiliser liaisons requête pour empêcher contre injection.

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

Ou pour vous insérer pouvez utiliser le insert_string() .

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

Il y a aussi 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");

Autres conseils

vous pouvez utiliser

$this->db->escape()

méthode ..

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

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

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

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 va construire vos requêtes pour vous et échapper 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 consulter la documentation Codeigniter pour la classe de base de données qui a une méthode d'évasion pour échapper à vos valeurs avant de les transmettre à la méthode de la requête. http://www.codeignitor.com/user_guide/database/queries.html

Ben

En CodeIgniter: Il y a 2 mesures pour prévenir toute 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 il peut exposer votre côté intérieur de la base de données de l'application, il est injection SQL.

Et heureusement, encore une fois, CodeIgniter a la capacité de faire face. Mais malheureusement, beaucoup de programmeur CI je collaborais (et même vous) a fait (ou pourrait) oublier cette deux mesures pour empêcher toute circonstance de l'injection SQL.

Memory Stick avec une capacité ActiveRecord La première chose est de ne pas en aucun cas traitant de l'interrogation des données en utilisant la requête complète comme ceci:

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

Vous ne savez pas exactement ce que l'intérieur $ utilisateur ou mot de passe $ variables quand il est à l'utilisateur qui fera délibérément la mauvaise chose. Même assainissant XSS ne traitera pas avec quelqu'un qui entrées combinaison de citation, ou le caractère de virgule tiret en elle. Donc dans ce cas, vous devez apprendre cette chose Active Record, car il a la capacité d'entrée de assainissant dédiée à empêcher l'injection SQL. Et ne vous inquiétez pas, il prend en charge type de fonction enchaînant comme ceci:

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

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

Mais rappelez-vous, il ne fonctionnera pas si vous n'avez toujours la combinaison fonction de requête habituelle (partiellement) à l'intérieur de la fonction d'enregistrement actif comme ceci:

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

Ce qui pourrait effectivement être changé comme celui-ci.

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

Le point est, utiliser tous les bits de possibilité d'Active Record de CodeIgniter et ne plaisante pas avec elle.

Mais si ce n'est pas le travail, il existe une alternative Si vous avez une très longue requête et ne prenez pas la peine de le convertir au style de Active Record, vous pouvez aseptisée votre entrée manuellement en utilisant cette fonction:

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

// Pour une utilisation à l'intérieur comme query

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

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

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

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

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

Lors de l'insertion préférable d'utiliser CodeIgniter méthode insertion,

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

Lorsque vous utilisez cette méthode codeingniter faire automatiquement tout échapper donc nous pas besoin n'échappent manuel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top