
G.SINGH
Ursprünglich habe ich verwendet mysql_connect
und mysql_query
Sachen machen. Dann lernte ich die SQL-Injection kennen, also versuche ich zu lernen, wie man vorbereitete Anweisungen verwendet. Ich verstehe, wie nützlich die Funktionen zum Vorbereiten und Ausführen der PDO-Klasse sind, um eine SQL-Einschleusung zu verhindern.
Sind vorbereitete Anweisungen nur dann erforderlich, wenn eine Benutzereingabe in einer Datenbank gespeichert wird? Wäre es in Ordnung, es noch zu verwenden mysql_num_rows
, da ich mit dieser Funktion eigentlich nicht Gefahr laufe, gehackt zu werden? Oder ist es sicherer, dafür vorbereitete Anweisungen zu verwenden? Sollte ich vorbereitete Anweisungen für alles verwenden, was mit MySQL zu tun hat? Warum?

Darren
tl/dr
Immer. Nutze es zu 100%. Immer; und selbst wenn Sie es nicht brauchen. NOCH NOCH VERWENDEN.
mysql_*
Funktionen sind veraltet. (Beachten Sie das große rote Kästchen?)
Warnung Diese Erweiterung war in PHP 5.5.0 veraltet und wurde in PHP 7.0.0 entfernt. Stattdessen die MySQLi oder PDO_MySQL Erweiterung verwendet werden soll. Siehe auch MySQL: Auswahl einer API Führer und zugehörige FAQ für mehr Informationen. Alternativen zu dieser Funktion sind:
Verwenden Sie besser PDO
oder MySQLi
. Entweder von denen 2
reichen als kompatible Bibliotheken aus, wenn vorbereitete Anweisungen verwendet werden.
Benutzereingaben zu vertrauen, ohne vorbereitete Aussagen zu machen/diese zu säubern, ist, als würde man sein Auto unverschlossen und mit den Schlüsseln in der Zündung in einer schlechten Nachbarschaft stehen lassen. Du sagst im Grunde, komm einfach rein und nimm meine Leckereien 
Du solltest noch nie, und ich meine niemals, vertrauen Sie Benutzereingaben. Es sei denn, Sie möchten dies:

In Bezug auf die Daten und deren Speicherung, wie in den Kommentaren angegeben, können Sie noch nie und sollten niemals benutzerbezogenen Eingaben vertrauen. Sofern Sie nicht zu 101 % sicher sind, dass die Daten, die zum Manipulieren dieser Datenbanken/Werte verwendet werden, in Ihrer App fest codiert sind, müssen Sie vorbereitete Anweisungen verwenden.
Nun zu den Gründen, warum Sie vorbereitete Anweisungen verwenden sollten. Es ist einfach. Um die SQL-Injection zu verhindern, aber auf die einfachste Art und Weise. Die Art und Weise, wie vorbereitete Anweisungen funktionieren, ist einfach, es sendet die Anfrage und das Daten zusammen, aber getrennt (wenn das sinn macht haha) – Was ich meine ist folgendes:
Prepared Statements
Query: SELECT foo FROM bar WHERE foo = ?
Data: [? = 'a value here']
Im Vergleich zu seinem Vorgänger, bei dem Sie eine Abfrage mit den Daten abgeschnitten und als Ganzes gesendet haben – 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 vorbereiteter Anweisungen/Bindungen zu zeigen.
$dbh = PDO(....); // dsn in there mmm yeahh
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name="one";
$value = 1;
$stmt->execute();
Entnommen aus dem PHP-Handbuch für vorbereitete PDO-Anweisungen
Mehr Lesen

Elixenid
TL;DR Verwenden Sie zu 100 % vorbereitete Anweisungen, wenn Ihre App Benutzereingaben akzeptiert
Du scheinst eine leichte Verwirrung zu haben. Erstens bitte nicht verwenden mysql_*
; der mysql_*
Funktionen sind veraltet, veraltet, und unsicher. Verwenden MySQLi
oder PDO
stattdessen. Sekunde, mysql_num_rows
hat nichts mit vorbereiteten Anweisungen zu tun und ist sowieso kein PDO-Feature. Sie bereiten die Anweisung vor, bevor Sie die Abfrage ausführen, nicht danach, wenn Sie Zeilen zählen möchten.
Was die Vorbereitung von Erklärungen betrifft, hat @Mike’Pomax’Kamermans es in den Kommentaren getroffen. Wenn Sie jemals, auch nur einmal, Daten verwenden, die jemals von einem Benutzer berührt wurden – selbst von einem vermeintlich vertrauenswürdigen Benutzer – oder die von irgendeiner Art von Drittanbieter oder Drittanbieteranwendung, einschließlich eines Browsers, generiert wurden, verwenden Sie vorbereitete Anweisungen. Nur wenn 100 % Ihrer Daten fest codiert sind oder vollständig von Ihrem Code generiert werden (wie eine einfache Zählervariable), können Sie ihnen vertrauen.
Zum Beispiel können Sie nicht vertrauen:
- Benutzernamen
- Passwörter
- E-mailadressen
- Benutzerkommentare
- Telefonnummern
- Termine
- Zeichenfolgen suchen
- Browser-Client-Strings
- Kreditkartennummern
- Dateinamen für Uploads
- Und irgendein andere Art von Eingaben, die von einem Benutzer erstellt wurden oder die ein Benutzer manipulieren könnte.
All dies sollten Sie natürlich validieren (z. B. überprüfen, ob eine E-Mail-Adresse wirklich eine E-Mail-Adresse ist), bevor Sie sie in eine Datenbank eingeben. Aber selbst dann ist die Verwendung vorbereiteter Anweisungen der sichere Weg.
Dafür gibt es zwei Lösungen:
01- Verwenden Sie vorbereitete Anweisungen
Um SQL-Injektionen zu verhindern, müssen wir so genannte vorbereitete Anweisungen verwenden, die gebundene Parameter verwenden. Vorbereitete Anweisungen kombinieren keine Variablen mit SQL-Strings, sodass es einem Angreifer nicht möglich ist, 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, nicht als Teil der SQL-Anweisung.
02- Vorbereitete Anweisungen mit mySQLi.
Wenn Sie die Methoden in den folgenden Schritten verwenden, müssen Sie keine anderen SQL-Injection-Filtertechniken wie mysql_real_escape_string() verwenden. Dies liegt daran, dass mit vorbereiteten Anweisungen keine herkömmliche SQL-Injektion durchgeführt werden kann.
z.B –
$name = $_GET['username'];
if ($stmt = $mysqli->prepare("SELECT password FROM tbl_users WHERE name=?")) {
// Bind a variable to the parameter as a string.
$stmt->bind_param("s", $name);
// Execute the statement.
$stmt->execute();
// Get the variables from the query.
$stmt->bind_result($pass);
// Fetch the data.
$stmt->fetch();
// Display the data.
printf("Password for user %s is %s\n", $name, $pass);
// Close the prepared statement.
$stmt->close();
}
Sie können mehr über dieses Formular finden – http://www.wikihow.com/Prevent-SQL-Injection-in-PHP

Rakesh Sharma
Mysql_*
bereits veraltet, also besser wechseln mysqli_*
oder PDO
Zum Verhindern der SQL-Einschleusung (mysql): – Wie kann ich die SQL-Einschleusung in PHP verhindern?.
Und vorbereitete Anweisungen (Dies sind SQL-Anweisungen, die getrennt von Parametern an den Datenbankserver gesendet und analysiert werden. ) Verwenden Sie für alle von Benutzern generierten Abfragedaten.
wie beim Posten von Daten, die Sie mit einer Abfrage an die Datenbank anpassen / Datensätze erhalten. also gemein, wenn Sie eine Abfrage mit Formulardaten auslösen.
9881600cookie-checkWann sollte ich vorbereitete Anweisungen verwenden?yes
Wenn Sie garantieren können, dass kein Teil Ihrer Codebasis jemals benutzergenerierte Abfragedaten verwendet, hat es sehr wenig Sinn. Wenn Sie auch nur eine einzige Abfrage haben, macht es keinen Sinn, zwei verschiedene Arten der Abfrage zu verwenden. Verwenden Sie zuerst vorbereitete Abfragen für die Sicherheit und dann für die Konsistenz.
– Mike „Pomax“ Kamermans
28. Juli 2014 um 5:27 Uhr
Du scheinst eine leichte Verwirrung zu haben. Erstens bitte nicht verwenden
mysql_*
; dermysql_*
Funktionen sind veraltet, veraltet, und unsicher. VerwendenMySQLi
oderPDO
stattdessen. Sekunde,mysql_num_rows
hat nichts mit vorbereiteten Anweisungen zu tun und ist sowieso kein PDO-Feature. Sie bereiten die Anweisung vor, bevor Sie die Abfrage ausführen, nicht danach, wenn Sie Zeilen zählen möchten.– Elixenid
28. Juli 2014 um 5:36 Uhr