Wann sollte ich vorbereitete Anweisungen verwenden?

Lesezeit: 8 Minuten

Wann sollte ich vorbereitete Anweisungen verwenden
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?

  • 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_*; 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.

    – Elixenid

    28. Juli 2014 um 5:36 Uhr

1646921049 742 Wann sollte ich vorbereitete Anweisungen verwenden
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 Geben Sie hier die Bildbeschreibung ein

Du solltest noch nie, und ich meine niemals, vertrauen Sie Benutzereingaben. Es sei denn, Sie möchten dies:

SQL-Injektion

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

  • @ Darren Ich möchte wissen, ob ich das richtig verstehe. Ist es notwendig, eine vorbereitete Anweisung zu verwenden, wenn es nur feste Werte gibt? Zum Beispiel muss jemand eine Anfrage genehmigen oder ablehnen, und die einzige Eingabe, die diese Person erhält, ist die Auswahl von 2 Schaltflächen “Genehmigen” und “Verweigern”, und jede der Schaltflächen schreibt unterschiedliche Werte, die festgelegt sind. Muss ich dort eine vorbereitete Anweisung verwenden? Notiz: Diese Seite bietet dem Benutzer keine Möglichkeit, Text einzugeben.

    – Broebie

    3. Dezember 2015 um 12:24 Uhr

  • @BRoebie Es ist besser, auf Nummer sicher zu gehen. Überall dort, wo ein Benutzer mit durchlaufenden Daten interagieren kann (z. B. Formulare), sollten im Wesentlichen vorbereitete Anweisungen vorhanden sein. Wenn Sie diese Werte aus einer Eingabe nehmen, die leicht durch die Elementinspektion usw. geändert werden kann, könnten Sie in große Schwierigkeiten geraten.

    – Darren

    3. Dezember 2015 um 23:34 Uhr

  • @ Darren Ich stimme zu. Ich habe mich gefragt, ob ich vorbereitete Anweisungen verwenden muss, wenn der Benutzer nur mit 2 Schaltflächen auf der Seite interagieren könnte, die man schreiben würde Antrag genehmigt in die db und die andere taste würde schreiben Anfrage abgelehnt in der db. (und ja, es ist ein Formular, von dem ich spreche, aber alle Felder dort sind schreibgeschützte Felder, die nicht geändert werden können, nur die 2 Schaltflächen, die ich oben erwähnt habe, mit festen Werten im Code, die an die Datenbank gesendet werden.)

    – Broebie

    4. Dezember 2015 um 7:54 Uhr

  • Ich weiß, dass dies sehr spät ist (schmerzhaft), aber ich möchte nur erwähnen, dass, wenn wir über „Benutzereingaben“ sprechen, dies die Anfrage bedeutet, die an Ihre Seite / Anwendung gesendet wird, nicht speziell ein Webformular. Benutzer können (zum Beispiel) eine HTTP-Anfrage direkt an Ihre Anwendung senden, ohne jemals tatsächlich die Indexseite (oder eine andere Seite) auf Ihrer Website anzufordern. Bitte verstehen Sie, wie die Kommunikation zwischen Server und Client funktioniert, denn dies ist KRITISCH 😉

    – Benutzer236800

    2. Januar 2021 um 11:26 Uhr

1646921050 993 Wann sollte ich vorbereitete Anweisungen verwenden
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.

  • Ich verstehe, was Sie sagen. Der Grund, warum ich erwähnt habe, dass ich mysql_num_rows verwende, ist, dass ich dies gesehen habe stackoverflow.com/questions/11305230/… und es schien irgendwie sinnlos. Wenn keine Benutzerdaten verarbeitet werden, sollte mysql_num_rows in Ordnung sein, oder?

    – G. SINGH

    29. Juli 2014 um 2:42 Uhr

  • Jawohl; solange Sie sicher sind, dass es keine Benutzerdaten gibt, wie z SELECT COUNT(*) FROM mytable, müssen Sie keine vorbereiteten Anweisungen verwenden. Ich persönlich würde jedoch empfehlen, immer vorbereitete Anweisungen zu verwenden; Viele Sicherheitslücken werden eingeführt, wenn eine alte Abfrage ohne Benutzerdaten aktualisiert wird und der Programmierer vergisst, vorbereitete Anweisungen für die neue Abfrage zu verwenden. Das ist nur meine Meinung.

    – Elixenid

    29. Juli 2014 um 2:57 Uhr

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

Wann sollte ich vorbereitete Anweisungen verwenden
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.

988160cookie-checkWann sollte ich vorbereitete Anweisungen verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy