Maison >développement back-end >tutoriel php >Les noms de tables peuvent-ils être paramétrés dans les instructions préparées pour empêcher l'injection SQL ?

Les noms de tables peuvent-ils être paramétrés dans les instructions préparées pour empêcher l'injection SQL ?

DDD
DDDoriginal
2024-12-27 08:35:14324parcourir

Can Table Names Be Parameterized in Prepared Statements to Prevent SQL Injection?

Paramétrage des noms de table dans les instructions préparées : est-ce possible ?

Tenter de paramétrer les noms de table dans les instructions préparées conduit généralement à des vulnérabilités d'injection SQL. Bien que la fonction mysqli_stmt_bind_param permette de lier des paramètres à des valeurs, elle ne prend pas en charge les noms de table paramétrés.

Par exemple, l'extrait de code suivant illustre une tentative de paramétrage du nom de table :

function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol) {
    $statement = $mysqli->prepare("INSERT INTO ? VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param($statement, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol));
    $statement->execute();
}

Cependant , cette approche est incorrecte et entraînera une requête non valide une fois exécutée. Les instructions préparées sont conçues pour lier des paramètres à des valeurs spécifiques, et les noms de table ne sont pas considérés comme des valeurs pouvant être paramétrées.

Au lieu de cela, il est recommandé d'utiliser des noms de table statiques en conjonction avec une liste blanche de valeurs autorisées pour se protéger contre Injection SQL. Par exemple :

function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol) {
    if (!in_array($new_table, $allowed_tables)) {
        throw new Exception("Invalid table name");
    }

    $statement = $mysqli->prepare("INSERT INTO $new_table VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param($statement, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol);
    $statement->execute();
}

Cette approche garantit que seuls les noms de table valides sont utilisés, atténuant ainsi les risques d'injection SQL associés aux changements dynamiques de nom de table.

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