Heim >Backend-Entwicklung >PHP-Tutorial >Können Tabellennamen in vorbereiteten Anweisungen parametrisiert werden, um SQL-Injection zu verhindern?

Können Tabellennamen in vorbereiteten Anweisungen parametrisiert werden, um SQL-Injection zu verhindern?

DDD
DDDOriginal
2024-12-27 08:35:14324Durchsuche

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

Parametrisieren von Tabellennamen in vorbereiteten Anweisungen: Ist das möglich?

Der Versuch, Tabellennamen in vorbereiteten Anweisungen zu parametrisieren, führt häufig zu SQL-Injection-Schwachstellen. Während die Funktion mysqli_stmt_bind_param das Binden von Parametern an Werte ermöglicht, unterstützt sie keine parametrisierten Tabellennamen.

Der folgende Codeausschnitt zeigt beispielsweise einen Versuch, den Tabellennamen zu parametrisieren:

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();
}

Allerdings , ist dieser Ansatz falsch und führt bei der Ausführung zu einer ungültigen Abfrage. Vorbereitete Anweisungen dienen dazu, Parameter an bestimmte Werte zu binden, und Tabellennamen gelten nicht als Werte, die parametrisiert werden können.

Stattdessen wird zum Schutz empfohlen, statische Tabellennamen in Verbindung mit einer Whitelist zulässiger Werte zu verwenden SQL-Injection. Zum Beispiel:

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();
}

Dieser Ansatz stellt sicher, dass nur gültige Tabellennamen verwendet werden, wodurch das SQL-Injection-Risiko im Zusammenhang mit dynamischen Tabellennamenänderungen verringert wird.

Das obige ist der detaillierte Inhalt vonKönnen Tabellennamen in vorbereiteten Anweisungen parametrisiert werden, um SQL-Injection zu verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn