Vorbereitete Aussagen und Sicherheit von Tabellennamen: Eine kritische Prüfung
Viele Entwickler verlassen sich auf mysqli_stmt_bind_param
, um SQL-Injection-Schwachstellen zu verhindern. Allerdings stellt dieser Ansatz beim Versuch, Tabellennamen zu parametrisieren, Herausforderungen dar.
Betrachten Sie dieses Beispiel:
<code class="language-php">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($statement, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol); $statement->execute(); }</code>
Während dadurch versucht wird, die SQL-Injection durch das Binden von Variablen abzuschwächen, bleibt der Tabellenname $new_table
anfällig. Können wir einen Platzhalter für $new_table
innerhalb der vorbereiteten Anweisung verwenden?
Nein. Von der Datenbank vorbereitete Anweisungen unterstützen nur die Parameterbindung für Werte, nicht für Tabellen- oder Spaltenbezeichner. Dies liegt daran, dass der Tabellenname ein wesentlicher Bestandteil der Struktur und Gültigkeit der SQL-Anweisung ist; Eine dynamische Änderung könnte zu ungültigem SQL führen.
Selbst bei Datenbankschnittstellen wie PDO, die eine flexiblere Platzhalternutzung bieten, führt der Versuch, einen Tabellennamen direkt zu ersetzen, zu ungültigem SQL:
<code class="language-sql">SELECT * FROM ?</code>
Der richtige Ansatz besteht darin, String-Interpolation zu verwenden:
<code class="language-php">SELECT * FROM {$mytable}</code>
Dies erfordert jedoch eine entscheidende Sicherheitsmaßnahme: strenges Tabellen-Whitelisting. Validieren Sie $mytable
immer anhand einer vordefinierten Liste zulässiger Tabellennamen, um zu verhindern, dass böswillige Eingaben Ihre Datenbank gefährden. Verlassen Sie sich bei der Sicherheit von Tabellennamen niemals ausschließlich auf vorbereitete Anweisungen.
Das obige ist der detaillierte Inhalt vonKönnen vorbereitete Anweisungen Tabellennamen sicher parametrisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!