Heim > Datenbank > MySQL-Tutorial > Können vorbereitete Anweisungen Tabellennamen sicher parametrisieren?

Können vorbereitete Anweisungen Tabellennamen sicher parametrisieren?

DDD
Freigeben: 2025-01-23 18:16:14
Original
657 Leute haben es durchsucht

Can Prepared Statements Securely Parameterize Table Names?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Der richtige Ansatz besteht darin, String-Interpolation zu verwenden:

<code class="language-php">SELECT * FROM {$mytable}</code>
Nach dem Login kopieren

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!

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