Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ersetzen von mysql_*-Funktionen durch PDO und vorbereitete Anweisungen

Danke für die interessante Frage. Bitte schön:

Es entgeht gefährlichen Zeichen,

Ihr Konzept ist völlig falsch.
Tatsächlich ist „gefährliche Zeichen“ ein Mythos, es gibt keine . Aus dieser Definition können Sie auf ihre Einschränkungen schließen - sie funktioniert nur für Strings .

Es ist jedoch immer noch anfällig für andere Angriffe, die sichere Zeichen enthalten können, aber schädlich sein können, um entweder Daten anzuzeigen oder in einigen Fällen Daten böswillig zu ändern oder zu löschen.

Du vermischst hier alles.
Apropos Datenbank,

  • für die Saiten ist es NICHT angreifbar. Solange Ihre Strings in Anführungszeichen und Escapezeichen gesetzt werden, können sie das nicht „Daten böswillig ändern oder löschen“.*
  • für den anderen Datentyp data - ja, es ist nutzlos . Aber nicht, weil es etwas "unsicher" ist, sondern nur wegen unsachgemäßer Verwendung.

Was die Anzeige von Daten angeht, nehme ich an, dass sie offtopic sind in der PDO-bezogenen Frage, da PDO auch nichts mit der Anzeige von Daten zu tun hat.

Benutzereingaben maskieren

^^^ Eine weitere zu beachtende Täuschung!

  • Eine Benutzereingabe hat absolut nichts mit Escaping zu tun . Wie Sie aus der vorherigen Definition lernen können, müssen Sie Zeichenfolgen maskieren, nicht irgendwelche "Benutzereingaben". Also nochmal:

    • Sie haben Escape-Strings, unabhängig von ihrer Quelle
    • Es ist sinnlos, andere Arten von Daten zu maskieren, egal aus welcher Quelle.

Verstanden?
Nun, ich hoffe, Sie verstehen die Grenzen der Flucht sowie das Missverständnis der „gefährlichen Charaktere“.

Nach meinem Verständnis ist die Verwendung von PDO/vorbereiteten Anweisungen viel sicherer

Nicht wirklich.
Tatsächlich sind es vier verschiedene Abfrageteile, die wir dynamisch hinzufügen können:

  • eine Zeichenfolge
  • eine Zahl
  • eine Kennung
  • ein Syntaxschlüsselwort.

Sie können also sehen, dass das Entkommen nur ein Problem abdeckt. (Aber natürlich, wenn Sie Zahlen als Zeichenfolgen behandeln (sie in Anführungszeichen setzen), falls zutreffend , Sie können sie auch sicher machen)

während vorbereitete Erklärungen - ugh - ganze 2 Ausgaben abdecken! Eine große Sache;-)

Für die anderen 2 Probleme siehe meine frühere Antwort, Sollte ich mich in PHP beim Senden von Strings an die Datenbank um illegale Zeichen kümmern, indem ich htmlspecialchars() verwende oder einen regulären Ausdruck verwenden?

Jetzt sind die Funktionsnamen unterschiedlich, sodass mysql_query, mysql_fetch_array, mysql_num_rows usw. nicht mehr funktionieren.

Das ist eine weitere, schwere Täuschung von PHP-Benutzern , eine Naturkatastrophe, eine Katastrophe:

Selbst wenn Sie einen alten MySQL-Treiber verwenden, sollten Sie niemals bloße API-Funktionen verwenden in ihrem Code! Man muss sie für den täglichen Gebrauch in eine Bibliotheksfunktion stecken! (Nicht als ein magischer Ritus, sondern nur um den Code kürzer, weniger repetitiv, fehlersicher, konsistenter und lesbarer zu machen).

Dasselbe gilt auch für die PDO!

Jetzt wieder mit deiner Frage.

aber beseitigt dies die Notwendigkeit, so etwas wie mysql_real_escape_string zu verwenden?

JA.

Aber ich denke, das ist ungefähr die Vorstellung davon, was getan werden sollte, um einen Benutzer aus einer Datenbank abzurufen

Nicht zum Abrufen, sondern um beliebige Daten zur Abfrage hinzuzufügen !

Sie müssen nach PDO:PARAM_STR eine Länge angeben, wenn ich mich nicht irre

Du kannst, musst aber nicht.

Nun, ist das alles sicher?

In Bezug auf die Datenbanksicherheit gibt es in diesem Code einfach keine Schwachstellen. Hier gibt es nichts zu sichern.

für die angezeigte Sicherheit - durchsuchen Sie diese Seite einfach nach dem XSS Schlüsselwort.

Hoffe, ich bringe etwas Licht in die Sache.

Übrigens, für die langen Einfügungen können Sie die Funktion verwenden, die ich eines Tages geschrieben habe, Hilfsfunktion mit PDO einfügen/aktualisieren

Allerdings verwende ich im Moment keine vorbereiteten Anweisungen, da ich meine selbst erstellten Platzhalter ihnen vorziehe und eine Bibliothek verwende Ich erwähnte oben. Um dem unten von riha geposteten Code entgegenzuwirken, wäre er so kurz wie diese 2 Zeilen:

$sql  = 'SELECT * FROM `users` WHERE `name`=?s AND `type`=?s AND `active`=?i';
$data = $db->getRow($sql,$_GET['name'],'admin',1);

Aber natürlich können Sie denselben Code auch mit vorbereiteten Anweisungen haben.

* (yes I am aware of the Schiflett's scaring tales)