Maison >base de données >tutoriel mysql >Comment puis-je utiliser en toute sécurité les paramètres ORDER BY avec les instructions préparées par PDO ?

Comment puis-je utiliser en toute sécurité les paramètres ORDER BY avec les instructions préparées par PDO ?

DDD
DDDoriginal
2024-12-26 01:12:10795parcourir

How Can I Securely Use ORDER BY Parameters with PDO Prepared Statements?

Instruction préparée PDO : définition des paramètres ORDER BY

Lorsque vous travaillez avec des instructions PDO préparées, vous pouvez rencontrer des difficultés lorsque vous essayez d'utiliser des paramètres dans le Clause ORDER BY. Bien que l'instruction s'exécute sans erreur, elle peut ne renvoyer aucun résultat.

Pour résoudre ce problème, il est nécessaire d'insérer les arguments ORDER BY directement dans l'instruction SQL, comme démontré dans le code suivant :

$order = 'columnName';
$direction = 'ASC';

$stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction");

Il est crucial de s'assurer que chaque opérateur et identifiant est codé en dur et non généré dynamiquement. Cette approche permet d'éviter les attaques par injection.

Une autre façon d'améliorer la sécurité de votre code consiste à utiliser une fonction d'assistance de liste blanche, comme celle présentée ci-dessous :

function white_list($value, $allowed_values, $error_message) {
    if (!in_array($value, $allowed_values)) {
        throw new Exception($error_message);
    } else {
        return $value;
    }
}

En employant cette fonction, vous pouvez vérifier que la valeur saisie existe dans une liste prédéfinie de valeurs valides et générer une erreur si ce n'est pas le cas.

En utilisant cette approche, votre instruction préparée sera à la fois sécurisé et capable de gérer correctement les paramètres ORDER BY :

$order = white_list($order, ["name", "price", "qty"], "Invalid field name");
$direction = white_list($direction, ["ASC", "DESC"], "Invalid ORDER BY direction");

$sql = "SELECT field from table WHERE column = ? ORDER BY $order $direction";
$stmt = $db->prepare($sql);
$stmt->execute([$is_live]);

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