Wann sollte ich vorbereitete Anweisungen verwenden?

7

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.

    
G.SINGH 28.07.2014, 05:25
quelle

4 Antworten

28

tl / dr

Immer. 100% der Zeit verwenden Sie es. Immer; und selbst wenn du es nicht benutzen musst. VERWENDEN SIE ES NOCH.

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.

%Vor%

Aus dem PHP-Handbuch für vorbereitete PDO-Statements übernommen

Mehr lesen

Darren 28.07.2014, 05:41
quelle
1

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:

  • Benutzernamen
  • Passwörter
  • E-Mail-Adressen
  • Benutzer Kommentare
  • Telefonnummern
  • Termine
  • Suchzeichenfolgen
  • Browser-Client-Zeichenfolgen
  • Kreditkartennummern
  • Dateinamen für Uploads
  • Und beliebige andere Art von Eingaben, die von einem Benutzer erstellt wurden oder die ein Benutzer manipulieren könnte.

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.

    
Ed Cottrell 28.07.2014 05:40
quelle
0

Mysql_* wurde bereits veraltet, daher sollte mysqli_* oder PDO

besser geändert werden

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.

    
Rakesh Sharma 28.07.2014 05:30
quelle
0

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 - Ссылка

    
Sri 28.07.2014 05:46
quelle

Tags und Links