Heim >Backend-Entwicklung >PHP-Tutorial >Können vorbereitete Anweisungen Tabellennamen in SQL parametrisieren?
Können parametrisierte Anweisungen Tabellennamen verarbeiten?
Beim Versuch, den Tabellennamen in einer vorbereiteten Anweisung zu parametrisieren, ist ein Problem aufgetreten. Das Trennen von Variablen zum Schutz vor SQL-Injection hat zu Fehlern geführt.
Der von Ihnen bereitgestellte Code enthält die Funktion insertRow, die versucht, den neuen Tabellennamen als Fragezeichenanweisung zu binden.
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(); }
Leider ist die Parametrisierung des Tabellennamens in einer vorbereiteten Anweisung nicht möglich. Vorbereitete Anweisungen ermöglichen nur die Bindung von Parametern an „Wert“-Elemente einer SQL-Anweisung. Tabellennamen sind keine Laufzeitwerte und ändern die Gültigkeit der Anweisung und möglicherweise ihre Bedeutung.
Selbst wenn eine Datenbankschnittstelle wie PDO die Ersetzung von Platzhaltern an einer beliebigen Stelle zulassen würde, wäre der Wert des Tabellenplatzhalters eine in der Anweisung eingeschlossene Zeichenfolge SQL, was zu ungültigem SQL führt.
Zum Schutz vor SQL-Injection ist es wichtig, eine Whitelist von Tabellen zu verwenden und Benutzereingaben anhand dieser Liste zu überprüfen. Ihr Code sollte wie folgt aussehen:
if (in_array($mytable, $whitelist)) { $result = $db->query("SELECT * FROM {$mytable}"); }
Das obige ist der detaillierte Inhalt vonKönnen vorbereitete Anweisungen Tabellennamen in SQL parametrisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!