Vorbereitete Aussagen: Einführung und Beispiele
Datenbankverwaltungssysteme (DBMS), die mit der SQL-Sprache arbeiten, sind sehr beliebt, aber auch ein häufiges Ziel von Manipulationen bei der Datenbereitstellung. So sind beispielsweise Benutzereingaben mit unzureichender Verschlüsselung und Metazeichen wie Anführungszeichen oder Semikolons eine leichte Beute für Cyberkriminelle. Eine mögliche Lösung für dieses Problem ist die Verwendung von vorbereiteten Anweisungen oder vorbereiteten Anweisungen , dh Vorlagen von Anweisungen für Datenbanken, denen bis zum Zeitpunkt ihrer Ausführung keine Daten zugewiesen sind.
Was ist das Besondere an dieser Technik und in welchen Situationen wird sie eingesetzt? Als Beispiel zeigen wir Ihnen, wie vorbereitete Anweisungen in MySQL funktionieren und wie sie in der Datenbankverwaltung verwendet werden können.
- Was ist eine vorbereitete Aussage?
- Warum sollte ich vorbereitete Anweisungen in MySQL und ähnlichen Systemen verwenden?
- Wie genau wird eine vorbereitete Aussage verwendet?
- Phase 1: Vorbereitung
- Phase 2: Vorlagenverarbeitung im DBMS
- Phase 3: Ausführung
- Tutorial: Verwenden vorbereiteter Anweisungen in MySQL mit MySQLi
- PREPARE, EXECUTE und DEALLOCATE PREPARE: Die drei grundlegenden SQL-Anweisungen für die Verwendung einer vorbereiteten Anweisung
- SQL-Anweisungen, die als vorbereitete Anweisungen in MySQL verwendet werden können
- Besonderheiten der SQL-Syntax der vorbereiteten Anweisungen in PHP
- Vorbereitete Anweisungen in MySQLi: Beispiel
Was ist eine vorbereitete Aussage?
Die vorbereiteten Anweisungen , auch Abfragen, Befehle oder vorbereitete Anweisungen genannt, sind Vorlagen für Abfragen an die SQL-Sprache von Datenbanksystemen, deren Parameter keine Werte enthalten. Um diese Werte zu ersetzen, arbeiten diese Vorlagen mit Variablen oder Platzhaltern, die erst dann durch die tatsächlichen Werte ersetzt werden, wenn sie sich im System befinden. Wenn Abfragen von Hand eingegeben werden, werden die Werte zum Zeitpunkt der Ausführung zugewiesen.
Alle großen Datenbankverwaltungssysteme, die mit SQL arbeiten, wie MySQL, MariaDB, Oracle, Microsoft SQL Server und PostgreSQL, unterstützen vorbereitete Anweisungen , obwohl die meisten hierfür ein binäres NoSQL-Protokoll verwenden . Einige Systeme, einschließlich MySQL, verwenden bei der Implementierung vorbereiteter Anweisungen auch die herkömmliche SQL-Syntax . Einige Programmiersprachen wie Java, Perl, Python und PHP ermöglichen die Verwendung vorbereiteter Anweisungen in ihren Standardbibliotheken oder -erweiterungen. Wenn Sie mit PHP auf die Datenbank zugreifen, können Sie vorbereitete Anweisungen mit der objektorientierten Schnittstelle PHP Data Objects (PDO) oder mit der Erweiterung PHP MySQLi implementieren.
Warum sollte ich vorbereitete Anweisungen in MySQL und ähnlichen Systemen verwenden?
Der Hauptgrund für die Verwendung vorbereiteter Anweisungen bei der Arbeit mit Datenbankverwaltungssystemen wie MySQL ist nichts anderes als Sicherheit . Das größte Problem bei herkömmlichen Methoden für den Zugriff auf Datenbanken, die auf der SQL-Sprache basieren, ist die einfache Manipulation. Diese Arten von Angriffen werden als SQL-Injektionen bezeichnet: Der Code wird vervollständigt oder geändert, um Zugriff auf vertrauliche Daten zu erhalten oder sogar die vollständige Kontrolle über die Datenbank zu erlangen. In PHP und ähnlichen Sprachen führen vorbereitete Anweisungen nicht zu solchen Lücken im Sicherheitssystem, da sie erst dann konkrete Werte erhalten, wenn sie im System ausgeführt werden .
Voraussetzung für die Sicherheit einer vorbereiteten Anweisung ist, dass keine ihrer Komponenten aus einer externen Quelle generiert wurde .
Der Schutz vor SQL-Injections ist jedoch nicht das einzige Argument für diese Anforderungsvorlagen: Nach dem Analysieren und Kompilieren kann eine vorbereitete Anweisung bei Bedarf im Datenbanksystem wiederverwendet werden (durch Variieren der entsprechenden Daten) jedes Mal). Wenn es um SQL-Aufgaben geht, die immer wieder wiederholt werden müssen, benötigen vorbereitete Anweisungen weitaus weniger Ressourcen und sind schneller als manuelle Anforderungen.
Wie genau wird eine vorbereitete Aussage verwendet?
Ohne auf die Details der Programmiersprachen-Syntax oder die Merkmale jedes Datenbankverwaltungssystems einzugehen, wird die Einbeziehung und Verwendung vorbereiteter Anweisungen normalerweise in die folgenden Phasen unterteilt:
Phase 1: Vorbereitung
Der erste Schritt besteht darin, eine Anweisungsvorlage zu generieren. In PHP lautet die entsprechende Funktion prepare () . Anstelle der Werte werden den relevanten Parametern die oben genannten Platzhalter zugewiesen, die auch als Positionssubstitutionsparameter oder Bindungsvariablen bezeichnet werden . Im Allgemeinen sind diese Marker durch ein Fragezeichen ( ? ) Gekennzeichnet , wie im folgenden Beispiel:
INSERT INTO Producto (Nombre, Precio) VALUES (?, ?);
Abgeschlossene vorbereitete Anweisungen werden an das entsprechende Datenbankverwaltungssystem gesendet .
Phase 2: Vorlagenverarbeitung im DBMS
Das Datenbankverwaltungssystem (DBMS) analysiert , d. H. Analysieren der Anweisungsvorlage, damit sie in einem nächsten Schritt kompiliert, dh in einen ausführbaren Befehl konvertiert werden kann. Während dieses Prozesses wird zusätzlich die vorbereitete Anweisung optimiert .
Phase 3: Ausführung
Später kann die verarbeitete Vorlage jederzeit im Datenbanksystem wiederverwendet werden, sofern die verbundene Anwendung oder Datenquelle die entsprechende Eingabe bereitstellt, dh die Daten, die die Lesezeichen ersetzen Position. Zurückkommend auf den Code aus dem vorherigen Beispiel (Phase 1), der Name des Markers oder Parameter können den Wert zugewiesen werden Buch und den Preis Parameter den Wert 10 ; oder es könnte auch ein Computer mit dem Preiswert 1000 sein .
Tutorial: Verwenden vorbereiteter Anweisungen in MySQL mit MySQLi
Nachdem wir erklärt haben, wie vorbereitete Anweisungen funktionieren, erklären wir in diesem Tutorial anhand konkreter Beispiele , wie diese Vorlagen verwendet werden. Dazu nehmen wir:
- MySQL als Datenbankverwaltungssystem und
- PHP als Sprache der vorbereiteten Aussagen .
Neuere Versionen von MySQL unterstützen die Verwendung von serverseitig vorbereiteten Anweisungen, die auf einem Binärprotokoll basieren, das alle SQL-Datenaktualisierungsbefehle enthält und auch alle Aktualisierungen seit dem letzten Speichern der Daten protokolliert. Dieses Tutorial verwendet MySQLi , die PHP-Erweiterung , die auch vorbereitete Anweisungen über das Binärprotokoll unterstützt , als Zugriffsschnittstelle .
Eine gute und sehr beliebte Alternative zu MySQLi als API für vorbereitete Anweisungen ist die objektorientierte PDO -Schnittstelle (PHP Data Objects), die für Anfänger im Allgemeinen einfacher zu verwenden ist.
PREPARE, EXECUTE und DEALLOCATE PREPARE: Die drei grundlegenden SQL-Anweisungen für die Verwendung einer vorbereiteten Anweisung
Es gibt drei Befehle oder SQL-Anweisungen, die bei der Verwendung vorbereiteter Anweisungen in MySQL-Datenbanken eine entscheidende Rolle spielen :
Die PREPARE- Anweisung dient dazu , eine vorbereitete Anweisung für Ihre Anwendung vorzubereiten , niemals besser, und ihr unter anderem einen eindeutigen Namen zu geben , mit dem die Anweisung später abgerufen und gesteuert werden kann.
PREPARE stmt_name FROM preparable_stmt
Zum Ausführen von SQL-Anweisungen wurde bereits der erforderliche Befehl EXECUTE vorbereitet . Um anzugeben, welche vorbereitete Anweisung Sie insbesondere ausführen möchten, geben Sie den mit PREPARE generierten Namen ein . Jetzt können Sie entscheiden, wie oft Sie eine Anweisung ausführen möchten: Sie können so viele verschiedene Variablen generieren, wie Sie möchten, und ihnen jeweils so viele Werte zuweisen, wie Sie möchten.
EXECUTE stmt_name [USING @var_name [, @var_name] ...]
Um außer Kraft setzt eine vorbereitete Anweisung in PHP verwendet die AUFLÖSEN PREPARE Kommando . Die Anweisungen werden auch beim Schließen jeder Sitzung automatisch gelöscht . Dies ist wichtig, da andernfalls die maximale Anzahl von Anweisungen, die durch die Variable max_prepared_stmt_count festgelegt wurden , bald erreicht würde und keine neuen vorbereiteten Anweisungen mehr erstellt werden könnten.
{DEALLOCATE | DROP} PREPARE stmt_name
SQL-Anweisungen, die als vorbereitete Anweisungen in MySQL verwendet werden können
Nahezu alle für MySQL geltenden SQL-Anweisungen können als vorbereitete Anweisungen vorbereitet und ausgeführt werden . Eine Ausnahme bilden die sogenannten Diagnosebefehle, die nach dem SQL-Standard nicht als vorbereitete Anweisungen verwendet werden können. Dies sind insbesondere die folgenden Befehle:
- WARNHINWEISE ANZEIGEN
- ZAHL ANZEIGEN (*) WARNHINWEISE
- FEHLER ANZEIGEN
- COUNT ANZEIGEN (*) FEHLER
Darüber hinaus können keine Vorlagen für SQL-Anforderungen generiert werden, die auf die Systemvariablen warning_count und error_count verweisen .
Folgende Sätze oder Befehle können verwendet werden:
ALTER TABLE ALTER USER ANALYZE TABLE CACHE INDEX CALL CHANGE MASTER CHECKSUM {TABLE | TABLES} COMMIT {CREATE | DROP} INDEX {CREATE | RENAME | DROP} DATABASE {CREATE | DROP} TABLE {CREATE | RENAME | DROP} USER {CREATE | DROP} VIEW DELETE DO FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES | LOGS | STATUS | MASTER | SLAVE | USER_RESOURCES} GRANT INSERT INSTALL PLUGIN KILL LOAD INDEX INTO CACHE OPTIMIZE TABLE RENAME TABLE REPAIR TABLE REPLACE RESET {MASTER | SLAVE} REVOKE SELECT SET SHOW {WARNINGS | ERRORS} SHOW BINLOG EVENTS SHOW CREATE {PROCEDURE | FUNCTION | EVENT | TABLE | VIEW} SHOW {MASTER | BINARY} LOGS SHOW {MASTER | SLAVE} STATUS SLAVE {START | STOP} TRUNCATE TABLE UNINSTALL PLUGIN UPDATE
Besonderheiten der SQL-Syntax der vorbereiteten Anweisungen in PHP
Im Vergleich zur Standard-SQL-Syntax weist die Syntax einer vorbereiteten Anweisung einige Besonderheiten auf, die nicht ignoriert werden können. Zunächst wird die Verwendung von Platzhaltern für Parameterwerte hervorgehoben , dank derer vorbereitete Anweisungen einen großen Vorteil beim Zugriff auf Datenbankverwaltungssysteme bieten. Ab MySQL 8.0 können diese Platzhalter beispielsweise auch in den Parametern OUT und INOUT sowie in den Anweisungen PREPARE und EXECUTE verwendet werden . Bei IN- Parametern sind diese sogar unabhängig vom Datenbanksystem verfügbar. Andere spezifische Merkmale der vorbereiteten Anweisungssyntax sind wie folgt:
- Die SQL-Syntax der vorbereiteten Anweisungen in PHP erlaubt keine Verschachtelung . Daher kann eine Anweisung, auf die durch einen PREPARE- Befehl verwiesen wird , nicht PREPARE , EXECUTE oder DEALLOCATE PREPARE sein .
- Die vorbereiteten Anweisungen können in gespeicherten Prozeduren verwendet werden (Funktion zum Anfordern vollständiger Befehlsprozesse).
- Die sogenannten Mehrfachanweisungen , bei denen es sich um mehrere gleichzeitig gesendete Anweisungen handelt, sind innerhalb einer vorbereiteten Anweisung oder innerhalb einer durch Semikolons getrennten Zeichenfolge nicht möglich .
Vorbereitete Anweisungen in MySQLi: Beispiel
Das folgende Beispiel zeigt, welche Form ein Eintrag in MySQLi mit vorbereiteten Anweisungen in PHP hat :
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Establecer conexión $conn = new mysqli($servername, $username, $password, $dbname); // Comprobar conexión if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // Preparación de las prepared statements $stmt = $conn->prepare("INSERT INTO MisClientes (Nombre, Apellido, Correo) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $nombre, $apellido, $correo); // Asignación de parámetros y ejecución $Nombre = "Alicia"; $Apellido = "Torres"; $Correo = "[email protected]"; $stmt->execute(); $Nombre = "Juan"; $Apellido = "Martínez"; $Correo= "[email protected]"; $stmt->execute(); $Nombre = "Ana"; $Apellido = "López"; $Correo = "[email protected]"; $stmt->execute(); echo "Nuevas entradas añadidas con éxito"; $stmt->close(); $conn->close(); ?>
Dieses PHP-Skript stellt zunächst die Verbindung zur MySQL-Datenbank ( $ conn ) her, in der Sie die Daten des betreffenden Servers wie Computername, Benutzername, Kennwort und angeben müssen Name der Datenbank.
Mit der Zeile? INSERT INTO MisClientes ( Name, Nachname, E-Mail ) VALUES (?,?,?)? Der entscheidende Teil des vorbereiteten Satzes beginnt: Die MyClientes- Kundendatenbank muss Eingaben ( INSERT INTO ) in jedem der Parameter Vorname , Nachname und E-Mail erhalten . Werte ( VALUES ) werden zuerst durch Platzhalter ersetzt, die am Fragezeichen (?) Ersichtlich sind .
Als nächstes müssen Sie die Parameter ( bind_param ) binden . Dazu benötigt die Datenbank Informationen über den Datentyp, den sie verarbeiten wird. Das im Beispiel sss für diesen Zweck verwendete Argument zeigt, dass die drei Parameter Zeichenfolgen sind, dh Zeichenfolgen. Andere Linkalternativen wären die folgenden:
- i : INTEGER (Ganzzahl)
- d : DOUBLE (ungefährer numerischer Wert)
- b : BLOB (großes Binärdatenobjekt)
Um Ihre Privatsphäre zu schützen, wird das Video nach dem Klicken hochgeladen.