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
Freigeben: 2024-12-27 08:35:14
Original
409 Leute haben es durchsucht

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();
}
Nach dem Login kopieren

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();
}
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage