CodeIgniter gère les requêtes préparées, ce qui est une pratique importante pour la sécurité des applications web, car cela aide à prévenir les injections SQL. Les requêtes préparées séparent clairement les instructions SQL des données, permettant à la base de données de comprendre et d'analyser l'instruction SQL de manière isolée des données qui lui sont fournies. Cela signifie que les valeurs insérées dans la requête ne sont jamais traitées comme du code SQL, ce qui réduit le risque d'injections SQL.

Dans CodeIgniter 4, l'utilisation des requêtes préparées est facilitée par l'utilisation de l'interface Query Builder, qui construit automatiquement les requêtes en utilisant des requêtes préparées. Voici comment vous pouvez utiliser les requêtes préparées dans CodeIgniter :

Utilisation de Query Builder

Query Builder de CodeIgniter utilise des requêtes préparées pour exécuter des instructions SQL. Par exemple, pour insérer des données dans une table 

$data = [
    'username' => 'johndoe',
    'email' => 'john@example.com'
];

$model->insert($data);

 

Dans cet exemple, insert() est une méthode de Query Builder qui utilise des requêtes préparées pour insérer des données de manière sécurisée.

Exécution de Requêtes Préparées Manuellement

Vous pouvez également exécuter des requêtes préparées manuellement en utilisant la méthode prepare() de la classe Database :

$db = \Config\Database::connect();
$sql = "INSERT INTO users (username, email) VALUES (?, ?)";

$query = $db->prepare(function($db) use ($sql) {
    return $db->query($sql, ['johndoe', 'john@example.com']);
});

$query->execute();

 

Dans cet exemple, la requête SQL est préparée avec des placeholders ? pour les valeurs, et les valeurs réelles sont passées dans un tableau lors de l'appel de query().

Utilisation de Named Bindings

CodeIgniter permet également l'utilisation de "named bindings" dans les requêtes préparées, ce qui rend le code plus lisible :

$sql = "INSERT INTO users (username, email) VALUES (:username:, :email:)";

$query = $db->query($sql, [
    'username' => 'johndoe',
    'email' => 'john@example.com'
]);

Dans cet exemple, :username: et :email: sont des placeholders pour les valeurs qui sont ensuite associées dans le tableau passé à query().

Avantages des Requêtes Préparées

  • Sécurité : Réduit le risque d'injections SQL.
  • Performance : Les requêtes préparées peuvent être compilées une fois et exécutées plusieurs fois avec des données différentes, ce qui peut améliorer les performances pour les requêtes répétitives.
  • Maintenabilité : Rend le code plus propre et plus facile à maintenir.

L'utilisation des requêtes préparées est une bonne pratique en matière de développement sécurisé d'applications web, et CodeIgniter fournit les outils nécessaires pour les utiliser efficacement dans vos projets.


Validation et Sanitisation des Entrées

Pour les données récupérées de la requête ($this->request->getVar()), j'ai voici un exemple de sanitisation en utilisant FILTER_SANITIZE_STRING. Cela nettoie les données de description et de prix pour éviter les injections et autres vulnérabilités. Selon le type de données et l'utilisation, vous voudrez peut-être valider ou convertir explicitement ces valeurs (par exemple, en s'assurant que le prix est un nombre valide).

    public function store(): RedirectResponse
    {
        $model = new ItemModel();
        $description = $this->request->getVar('description', FILTER_SANITIZE_STRING);
        $price = $this->request->getVar('price', FILTER_SANITIZE_STRING); // Consider validating or casting to the correct type

        $model->save([
            'description' => $description,
            'price' => $price
        ]);

        return redirect()->to('/items');
    }
Modifié le: vendredi 2 février 2024, 06:08