Maison >base de données >tutoriel mysql >Comment puis-je utiliser en toute sécurité les noms de tables et de champs dynamiques dans les instructions préparées ?

Comment puis-je utiliser en toute sécurité les noms de tables et de champs dynamiques dans les instructions préparées ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-08 17:10:12556parcourir

How Can I Safely Use Dynamic Table and Field Names in Prepared Statements?

Utilisation d'instructions préparées pour lier des identifiants et des mots clés

Problème :

Création d'une requête dynamique en utilisant des instructions préparées, mais les tentatives de liaison des noms de tables, des noms de champs ou des mots-clés de syntaxe aboutissent à un résultat vide tableau.

Code :

function search_db($db, $searchTerm, $searchBy, $searchTable){
    try{
        $stmt = $db->prepare('
            SELECT 
                * 
            FROM 
                ?
            WHERE 
                ? LIKE ?
        ');
        $stmt->bindParam(1, $searchTable);
        $stmt->bindParam(2, $searchBy);
        $stmt->bindValue(3, '%'. $searchTerm.'%');
        $stmt->execute();
    } catch(Exception $e) {
        return array();
    }
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

Résultats attendus :
Un tableau de résultats de la base de données.

Résultats réels :
Un vide tableau.

Cause :
Les instructions préparées ne peuvent lier que des littéraux de données, pas des identifiants (tels que des noms de table ou de champ) ou des mots-clés de syntaxe.

Solution :

Pour utiliser des identifiants dynamiques ou des mots-clés, suivez ces étapes :

  1. Identifiants de format :

    • Entourez les identifiants entre guillemets : "identifiant".
    • Échapper aux guillemets à l'intérieur l'identifiant en les doublant : "identifier".
  2. Valeurs dynamiques de la liste blanche :

    • Créez une liste d'identifiants ou de mots-clés autorisés.
    • Vérifiez la valeur dynamique par rapport à la liste blanche avant d'utiliser il.

Code modifié :

$field = "`" . str_replace("`", "``", $field) . "`";
$table = "`" . str_replace("`", "``", $table) . "`";
$sql = "SELECT * FROM $table WHERE $field = ?";

Mots clés :

Si nécessaire, ajoutez également à la liste blanche et validez les mots-clés dynamiques. En suivant ces directives, vous pouvez inclure en toute sécurité des identifiants dynamiques et des mots-clés dans vos déclarations préparées.

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