Heim > Datenbank > MySQL-Tutorial > Wie können wir parametrisierte Tabellennamen in vorbereiteten Anweisungen sicher verwenden, um SQL-Injection zu verhindern?

Wie können wir parametrisierte Tabellennamen in vorbereiteten Anweisungen sicher verwenden, um SQL-Injection zu verhindern?

Mary-Kate Olsen
Freigeben: 2025-01-23 18:08:10
Original
368 Leute haben es durchsucht

How Can We Securely Use Parameterized Table Names in Prepared Statements to Prevent SQL Injection?

Parametrierte Tabellennamen in vorbereiteten Anweisungen: Ein Dilemma

Obwohl sich mysqli_stmt_bind_param als wirksam zum Schutz vor SQL-Injection erwiesen hat, stößt es auf Einschränkungen, wenn sich Variablen auswirken Tabellennamen beteiligt sind. Wie im bereitgestellten Codeausschnitt dargestellt:

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

Die problematische Verkettung von $new_table führt zu einer Anfälligkeit für SQL-Injection. Versuche, dies durch einen anderen Platzhalter zu ersetzen, wie im folgenden Snippet gezeigt, schlagen fehl:

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

Die Grenzen vorbereiteter Aussagen

Das Kernproblem liegt in der Unfähigkeit von vorbereiteten Anweisungen zum Schutz von Parametern, die die Struktur der SQL-Anweisung definieren, wie z. B. Tabellennamen. Dies liegt daran, dass vorbereitete Anweisungen ausschließlich Parameter für Werte zulassen, die die Bedeutung der Anweisung nicht ändern. Da Tabellennamen die Gültigkeit der SQL-Anweisung bestimmen, würde eine Änderung während der Ausführung diese möglicherweise ungültig machen.

Selbst bei Datenbankschnittstellen wie PDO, die vorbereitete Anweisungen emulieren, indem sie Parameter ersetzen, bevor sie an die Datenbank gesendet werden, sind Platzhalterwerte immer noch vorhanden Zeichenfolgen, die in der SQL-Anweisung eingeschlossen sind. Als Ergebnis: SELECT FROM ? mit mytable als Parameter würde letztendlich SELECT FROM 'mytable' an die Datenbank gesendet und damit ungültig gemacht.

Risikominderung

Der sicherste Ansatz bleibt bestehen Verwenden von $mytable innerhalb einer Zeichenfolge, es muss jedoch von einer Whitelist von Tabellen begleitet sein, anhand derer die Benutzereingaben überprüft werden. Dadurch wird verhindert, dass böswillige Akteure SQL-Anweisungen für beliebige Tabellen ausführen. Daher demonstriert der folgende Code eine sichere Implementierung:

if (whitelisted_tables($mytable)) {
    $statement = $mysqli->prepare("INSERT INTO $mytable VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}
Nach dem Login kopieren

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

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage