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
Libérer: 2024-12-18 22:48:11
original
128 Les gens l'ont consulté

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);
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal