Question

Je viens d'hériter d'un projet car 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 sur le code et je vois les appels de base de données dans le contrôleur comme suit:

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

Je viens d'hériter d'un projet car 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 sur le code et je vois les appels de base de données dans le contrôleur comme suit:

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

ou des appels comme celui-ci:

<*>

L'igniteur de code supprime-t-il automatiquement ces requêtes pour empêcher l'injection SQL?

POST['user_name']."'");

ou des appels comme celui-ci:

<*>

L'igniteur de code supprime-t-il automatiquement ces requêtes pour empêcher l'injection SQL?

Était-ce utile?

La solution

CodeIgniter ÉCHAPSE les variables que vous passez lorsque vous utilisez la méthode $ this- > db- > query . Mais UNIQUEMENT lorsque vous transmettez les variables en tant que liaisons, voici un exemple:

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

N'oubliez pas non plus que $ _ POST ne devrait pas être préféré à $ this- > input- > post car il vérifie si les variables existent pour empêcher erreurs.

Autres conseils

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

Extrait de Manuel de l'EC :

  

C’est une très bonne pratique de sécurité d’évacuer vos données avant de les envoyer dans votre base de données. CodeIgniter dispose de trois méthodes pour vous aider:

     
      
  1. $ this- > db- > escape () Cette fonction détermine le type de données de sorte qu'elle ne puisse échapper que les données de chaîne. Il ajoute également automatiquement des guillemets simples autour des données afin que vous n'ayez pas à:

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

Je posterais les deux autres exemples, mais je ne voudrais pas prendre tout le plaisir de lire le manuel.

Non, le code que vous avez publié est susceptible d’être injecté dans SQL. Vous devez utiliser la liaison de requête pour construire vos requêtes SQL. Si vous utilisez la bibliothèque de base de données CI, codez-la de la manière suivante (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')); 

Non, CodeIgniter ne nettoiera pas comme par magie les requêtes construites de cette manière.

Selon la documentation de CI, ici , la structure filtre les POST sur la construction du contrôleur. Le filtrage XSS est également facultatif, soit en appelant manuellement la fonction, soit en définissant une configuration globale.

Je n'ai jamais utilisé CI non plus, sauf pour jouer avec, alors je ne sais pas jusqu'où je pourrais faire confiance.

Cela n'échappe à rien. Vous feriez mieux de la changer à la syntaxe de liaison ou à la syntaxe d'enregistrement actif

Vous devez utiliser $ this- > input- > post, la liaison de requête et l'enregistrement actif pour disposer des données les plus sûres, puis encore, test test test pour en être sûr.

Utilisez l'enregistrement actif pour plus de sécurité et pour faciliter le codage:

Plutôt que:

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

Utilisez l'enregistrement actif pour plus de sécurité et pour faciliter le codage:

Plutôt que:

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');

Utilisation (même résultat):

<*>POST['user_name']."'");

Utilisation (même résultat):

<*>

Cela peut être pénible, mais vous devez convertir vos requêtes en enregistrement actif.

Je copie le manuel CodeIgniter: "Au-delà de la simplicité, l’utilisation des fonctionnalités Active Record présente un avantage majeur: elle vous permet de créer des applications indépendantes de la base de données, car la syntaxe de la requête est générée par chaque adaptateur de base de données. Il permet également des requêtes plus sûres, car le système échappe automatiquement les valeurs . "

Et comme certains l’ont déjà dit, ce code est susceptible d’être injecté par SQL

Optimisé avec un deuxième paramètre post (TRUE) pour filtrer XSS au niveau de l'entrée:

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

libraries / input.html

Les documents pour au moins la version 2.2, dans un grande boîte rouge:

  

Bien qu'Active Record fasse de son mieux pour citer correctement les noms de champs et de tables que vous lui donnez, notez qu'il n'est PAS conçu pour fonctionner avec une entrée utilisateur arbitraire. NE PAS l’alimenter avec des données utilisateur non authentifiées.

Ce qui signifie pour ce programmeur "ne vous fiez pas à Active Record pour citer rien ".

Utilisation de la fonction d'échappement pour l'injection de CI

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top