Maison >développement back-end >tutoriel php >Comment éviter l'injection SQL lors de l'utilisation de « bindValue » dans une clause LIMIT ?

Comment éviter l'injection SQL lors de l'utilisation de « bindValue » dans une clause LIMIT ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-18 22:48:11129parcourir

How to Avoid SQL Injection When Using `bindValue` in a LIMIT Clause?

Comment empêcher l'injection SQL lors de l'utilisation de BindValue dans la clause LIMIT

Lors de la tentative d'exécution d'une requête SQL à l'aide de la méthode bindValue pour paramétrer la clause LIMIT, PHP PDO peut ajouter guillemets simples aux valeurs des variables. Ce comportement peut entraîner des erreurs de syntaxe SQL, comme observé dans l'extrait de code fourni :

$fetchPictures->prepare("SELECT * 
    FROM pictures 
    WHERE album = :albumId 
    ORDER BY id ASC 
    LIMIT :skip, :max");

$fetchPictures->bindValue(':albumId', $_GET['albumid'], PDO::PARAM_INT);

if(isset($_GET['skip'])) {
    $fetchPictures->bindValue(':skip', trim($_GET['skip']), PDO::PARAM_INT);    
} else {
    $fetchPictures->bindValue(':skip', 0, PDO::PARAM_INT);  
}

$fetchPictures->bindValue(':max', $max, PDO::PARAM_INT);
$fetchPictures->execute() or die(print_r($fetchPictures->errorInfo()));
$pictures = $fetchPictures->fetchAll(PDO::FETCH_ASSOC);

Le message d'erreur "Vous avez une erreur dans votre syntaxe SQL" est probablement dû à l'ajout de guillemets simples à :skip variable dans la clause LIMIT.

On pense que ce comportement est lié à un bug de longue date dans PDO signalé en 2008 : https://bugs.php.net/bug.php?id=44639

Solution :

Comme suggéré dans la réponse, convertir les valeurs en entiers avant de passer les à la méthode bindValue résout ce problème :

$fetchPictures->bindValue(':skip', (int) trim($_GET['skip']), PDO::PARAM_INT);

En convertissant la variable $_GET['skip'] en un entier en utilisant (int) avant la liaison, nous empêchons PDO d'ajouter des guillemets simples et garantissons que la requête SQL est exécutée correctement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn