63 votes

CodeIgniter empêche-t-il automatiquement l'injection SQL ?

Je viens d'hériter d'un projet parce que le dernier développeur est parti. Le projet est construit à partir de Code Igniter. Je n'ai jamais travaillé avec Code Igniter auparavant.

J'ai jeté un coup d'œil rapide au code et je vois des appels de base de données dans le contrôleur comme ceci :

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

ou des appels comme celui-ci :

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

Est-ce que Code Igniter nettoie automatiquement ces requêtes pour éviter l'injection sql ?

0 votes

$this->db->escape() ajoutera ' aux chaînes de caractères et échappera à tous les guillemets internes.

0 votes

Vérifier la page roytuts.com/prevent-sql-injection-in-codeigniter/

70voto

MarioRicalde Points 3701

CodeIgniter FAIT ESCAPITRE les variables que vous passez en utilisant la fonction $this->db->query méthode. Mais UNIQUEMENT lorsque vous passez les variables en tant que liens, voici un exemple :

$dbResult = $this->db->query("SELECT * FROM users WHERE username = ?", array($this->input->post('username')));

Rappelez-vous également que $_POST ne devrait pas être préféré à $this->input->post puisqu'il s'agit de vérifier si les variables existent pour éviter les erreurs.

2 votes

Je pense qu'il devrait y avoir un deuxième paramètre passé à la fonction $this->input->post() qui indique essentiellement si l'entrée doit être assainie ou non. $dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username', TRUE)));

7 votes

Ceci n'est plus valable. Maintenant CodeIgniter échappe tout tant que vous utilisez leurs activeecords.

8 votes

@DavidWong Le fait que vous puissiez utiliser Active Record en tant que alternative n'empêche pas vraiment cette réponse d'être valable. Le code dans la question n'utilise aucune des deux solutions, et est donc ouvert à l'injection SQL.

20voto

John Himmelman Points 6672

CodeIgniter fournit quelques fonctions d'échappement de chaîne dans sa couche de base de données.

Extrait de Manuel CI :

C'est une très bonne pratique de sécurité que d'échapper vos données avant de les soumettre à votre base de données. CodeIgniter a trois méthodes qui vous aident à le faire :

  1. $this->db->escape() Cette fonction détermine le type de données afin de ne pouvoir échapper que des données de type chaîne de caractères. Elle ajoute aussi automatiquement des guillemets simples autour des données pour que vous n'ayez pas à le faire :

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

Je posterais bien les deux autres exemples, mais je ne voudrais pas gâcher le plaisir de la lecture du manuel.

27 votes

+1 pour "mais je ne voudrais pas enlever tout le plaisir de la lecture du manuel." :) -- une version plus douce de RTFM

0 votes

Lien brisé : Est-ce un remplacement adéquat ? ellislab.com/codeigniter/guide-utilisateur/base-de-données/requêtes.html

13voto

Funkatron Points 757

Non, le code que vous avez posté est sensible à l'injection SQL. Vous devez utiliser liaison de requête pour construire vos requêtes SQL. Si vous utilisez la bibliothèque CI DB, vous devez coder quelque chose comme ceci (exemple tiré du guide de l'utilisateur) :

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick'));

3 votes

@DavidWong Veuillez préciser. Êtes-vous en train de dire que CI va magiquement échapper à l'entrée dans le code fourni (bien qu'il n'ait aucun moyen de savoir qu'il est utilisé dans un contexte SQL) ? Ou simplement que la liaison de requêtes n'est plus l'approche recommandée pour ce problème ?

2 votes

Je n'en ai aucune idée, j'ai posté ce message il y a un an et j'utilise django maintenant. Mais j'admets que j'aurais dû me demander pourquoi, mais maintenant c'est trop tard.

3voto

Ben James Points 41165

Non, CodeIgniter ne nettoiera pas magiquement les requêtes qui ont été construites de cette façon.

2 votes

Construit comme quoi ? 0_0

3voto

Josh Lindsey Points 2298

Selon les documents de CI aquí le cadre filtre le POST sur la construction du contrôleur. Il peut également filtrer les XSS en appelant manuellement la fonction ou en définissant une configuration globale.

Je n'ai jamais utilisé l'IC non plus, sauf pour jouer avec, donc je ne suis pas sûr de pouvoir me fier à cette information.

2 votes

Le filtrage XSS et l'injection SQL ne sont pas la même chose. Il n'y a aucun moyen d'échapper correctement à SQL tant que vous ne savez pas à quelle base de données vous vous connectez (et, idéalement, sa locale actuelle), donc cela fera toujours partie d'une couche de base de données, pas d'une couche d'entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X