Ursprünglich habe ich mysql_connect und mysql_query benutzt, um Dinge zu tun. Dann habe ich von SQL-Injektion gelernt, also versuche ich zu lernen, wie man vorbereitete Anweisungen verwendet. Ich verstehe, wie die Vorbereitungs- und Ausführungsfunktionen der PDO-Klasse nützlich sind, um eine SQL-Injektion zu verhindern.
Aber sind vorbereitete Anweisungen nur notwendig, wenn eine Benutzereingabe in einer Datenbank gespeichert wird. Wäre es in Ordnung, weiterhin mysql_num_rows zu verwenden, da ich nicht wirklich riskiere, mit dieser Funktion gehackt zu werden? Oder ist es sicherer, vorbereitete Anweisungen dafür zu verwenden? Sollte ich vorbereitete Anweisungen für alles verwenden, was mysql betrifft? Warum?
Ich freue mich über alle Antworten und Rückmeldungen. Danke.
tl / dr
mysql_*
Funktionen sind veraltet. ( Beachten Sie die große rote Box? )
Warnung Diese Erweiterung wurde in PHP 5.5.0 veraltet und wurde entfernt in PHP 7.0.0. Stattdessen die MySQLi oder PDO_MySQL Erweiterung sollte sein benutzt. Siehe auch MySQL: Auswählen einer API und verwandte FAQ für mehr Information. Alternativen zu dieser Funktion sind:
Sie sollten besser PDO
verwenden oder MySQLi
. Eines dieser 2
wird als kompatible Bibliotheken ausreichen, wenn vorbereitete Anweisungen verwendet werden.
Die Benutzereingaben ohne vorbereitete Anweisungen zu vertrauen / zu bereinigen, ist so, als würde man sein Auto in einer schlechten Nachbarschaft lassen, entsperrt und mit den Schlüsseln im Zündschloss. Du sagst im Grunde, komm einfach rein und nimm meine Leckereien
Sie sollten niemals , und ich meine nie, vertraue Benutzereingaben. Es sei denn, du willst das:
In Bezug auf die Daten und deren Speicherung, wie in den Kommentaren angegeben, können Sie nie verwenden und niemals einer benutzerbezogenen Eingabe vertrauen. Wenn Sie nicht sicher sind, ob die Daten, die zur Manipulation der Datenbanken / Werte verwendet werden, in Ihrer App fest codiert sind, müssen Sie vorbereitete Anweisungen verwenden.
Jetzt, warum sollten Sie vorbereitete Aussagen verwenden. Es ist einfach. Um SQL Injection zu verhindern, aber auf die einfachste Art und Weise. Die Art wie vorbereitete Anweisungen funktionieren ist einfach, es sendet die Abfrage und die Daten zusammen, aber getrennt ( wenn das Sinn macht haha ) - Was ich meine ist das:
%Vor%Im Vergleich zu seinem Vorgänger, bei dem Sie eine Abfrage mit den Daten abgeschnitten haben, wurde sie als Ganzes gesendet - was wiederum bedeutet, dass sie als einzelne Transaktion ausgeführt wurde -, was zu SQL Injection-Schwachstellen führte.
Und hier ist ein Pseudo PHP PDO
Beispiel, um Ihnen die Einfachheit der vorbereiteten Anweisungen / Bindungen zu zeigen.
Aus dem PHP-Handbuch für vorbereitete PDO-Statements übernommen
Mehr lesen
TL; DR Verwenden Sie vorbereitete Anweisungen zu 100%, wenn Ihre App Benutzereingaben akzeptiert
Sie scheinen eine leichte Verwirrung zu haben. Zuerst, bitte verwende nicht mysql_*
; Die Funktionen mysql_*
sind veraltet, veraltet und unsicher. Benutze MySQLi
oder PDO
stattdessen. Zweitens hat mysql_num_rows
nichts mit vorbereiteten Anweisungen zu tun und ist sowieso kein PDO-Feature. Sie bereiten die Anweisung vor dem Ausführen der Abfrage vor und nicht danach, wenn Sie Zeilen zählen möchten.
Als für die Vorbereitung von Aussagen @ Mike'Pomax'Kamermans es in den Kommentaren genagelt. Wenn Sie jemals, auch nur einmal, Daten verwenden, die jemals von einem Benutzer - selbst einem angeblich vertrauenswürdigen Benutzer - berührt wurden oder von einer beliebigen Drittanbieteranwendung oder Drittanbieteranwendung, einschließlich eines Browsers, generiert werden, verwenden Sie vorbereitete Anweisungen. Nur wenn 100% Ihrer Daten fest codiert oder vollständig von Ihrem Code generiert werden (wie eine einfache Zählervariable), können Sie darauf vertrauen.
Zum Beispiel können Sie nicht vertrauen:
Sie sollten alle diese Punkte validieren (z. B. prüfen, ob eine E-Mail-Adresse wirklich eine E-Mail-Adresse ist), bevor Sie sie in eine Datenbank einfügen. Aber selbst dann ist die Verwendung vorbereiteter Aussagen der sicherste Weg.
Mysql_*
wurde bereits veraltet, daher sollte mysqli_*
oder PDO
Zur Vermeidung von SQL-Injection (mysql): - Wie kann ich verhindern? SQL-Injektion in PHP? .
Und vorbereitete Anweisungen (Dies sind SQL-Anweisungen, die vom Datenbankserver unabhängig von Parametern gesendet und analysiert werden.) Verwenden Sie alle von Ihnen generierten Abfragedaten.
Wie bei der Buchung von Daten, die Sie mit db mit Abfrage übereinstimmen / erhalten Datensätze. so gemein, wenn Sie eine Abfrage mit Formulardaten auslösen.
Dafür gibt es zwei Lösungen -
01 - Verwenden Sie vorbereitete Anweisungen
Um SQL-Injections zu verhindern, müssen wir sogenannte prepared statements verwenden, die gebundene Parameter verwenden. Vorbereitete Anweisungen kombinieren keine Variablen mit SQL-Zeichenfolgen. Daher ist es für einen Angreifer nicht möglich, die SQL-Anweisung zu ändern. Vorbereitete Anweisungen kombinieren die Variable mit der kompilierten SQL-Anweisung, das bedeutet, dass die SQL und die Variablen getrennt gesendet werden und die Variablen nur als Zeichenfolgen interpretiert werden und nicht Teil der SQL-Anweisung sind.
02- Prepared Statements mit mySQLi.
Bei Verwendung der Methoden in den folgenden Schritten müssen Sie keine anderen SQL-Injection-Filtertechniken wie mysql_real_escape_string () verwenden. Dies liegt daran, dass mit vorbereiteten Anweisungen keine konventionelle SQL-Injektion möglich ist.
zB -
%Vor%Sie können mehr über dieses Formular finden - Ссылка
Tags und Links php prepared-statement