Frage

Ich habe gesagt, dass ich besser PDO für MySQL zu entkommen mit würde, anstatt mysql_real_escape_string.

Vielleicht einen hirntoten Tag Ich habe (oder es kann die Tatsache sein, ich durch keine Ausdehnung der Phantasie bin ein natürlicher Programmierer, und ich bin immer noch sehr viel auf dem Neuling Bühne, wenn es um PHP kommt) , aber nachdem die PHP-Handbuch und lesen Sie den Eintrag auf PDO ausgecheckt, ich bin immer noch nicht klarer, was PDO eigentlich ist und warum es besser als mysql_real_escape_string verwenden. Dies kann, weil ich habe wirklich nicht mit der Komplexität der OOP noch in den Griff bekam (ich bin es ist, etwas zu tun mit OOP vorausgesetzt), aber auch andere als die Tatsache, dass Variablen und Array-Werte scheinen einen Doppelpunkt infront von ihnen zu haben, ich bin immer noch nicht sicher, was es eigentlich ist und wie Sie es verwenden (und warum es besser als mysql_real_escape_string. (es auch etwas mit der Tatsache zu tun, dass ich wirklich nicht, ein klares Verständnis von dem, was ‚Klassen‘ sind , so dass, wenn ich „PDO-Klasse“ las ich bin so klug wie zuvor wirklich).

Nach dem Lesen einen Artikel oder zwei auf dem ‚Entwickler Zone‘Bit der MySQL-Website, ich bin noch nicht klarer. Da ich nicht selbst herausfinden können, was es im Moment ist, denke ich, wahrscheinlich mit es jetzt ein bisschen über mich, aber ich bin immer noch daran interessiert, meine Ausbildung bei der Erweiterung und herauszufinden, wie ich die Dinge verbessern könnte.

Kann jemand mich in ‚plain English‘ erklären, was PDO (oder mich zu diesem Thema in die Richtung etwas in einfachem Englisch geschrieben Punkt), und wie würden Sie gehen davon mit?

War es hilfreich?

Lösung

Wie die aktuellen Antworten ins Detail gehen, während der Frage mehr zu einem allgemeinen Überblick richtet, ich werde es versuchen:

Die PDO Klassen zielen alle Funktionen kapseln benötigt, um mit einer Datenbank zu interagieren. Sie tun dies durch die Definition von ‚Methoden‘ (OO Salon für Funktionen) und ‚Eigenschaften‘ (OO Salon für Variablen). Sie würden sie als vollständiger Ersatz für alle die ‚Standard‘ Funktionen nutzen Sie jetzt verwenden, um eine Datenbank für das Gespräch.

Anstatt also eine Reihe der ‚mysql_doSomething ()‘ Aufruf von Funktionen, deren Ergebnisse in der eigenen Variablen zu speichern, würden Sie ‚instantiate‘ ein Objekt aus der PDO-Klasse ( ‚class‘ = abstrakte Definition, ‚Objekt‘ = Beton verwendbare Instanz einer Klasse) und Call-Methoden für das Objekt, das gleiche zu tun.

Als Beispiel ohne PDO, Sie so etwas tun würden:

// Get a db connection
$connection = mysql_connect('someHost/someDB', 'userName', 'password');
// Prepare a query
$query = "SELECT * FROM someTable WHERE something = " . mysql_real_escape_string($comparison) . "'";
// Issue a query
$db_result = mysql_query($query);
// Fetch the results
$results = array();
while ($row = mysql_fetch_array($db_result)) {
  $results[] = $row;
}

, während dies wäre das Äquivalent unter Verwendung von PDO:

// Instantiate new PDO object (will create connection on the fly)
$db = new PDO('mysql:dbname=someDB;host=someHost');
// Prepare a query (will escape on the fly)
$statement = $db->prepare('SELECT * FROM someTable WHERE something = :comparison');
// $statement is now a PDOStatement object, with its own methods to use it, e.g.
// execute the query, passing in the parameters to replace
$statement->execute(array(':comparison' => $comparison));
// fetch results as array
$results = $statement->fetchAll();

So auf den ersten Blick gibt es nicht viel Unterschied, außer in der Syntax. Aber die PDO-Version hat einige Vorteile, die größte Wesen Datenbank Unabhängigkeit:

Wenn Sie zu einer PostgreSQL-Datenbank zu reden brauchen stattdessen Sie würden nur mysql:to pgsql: im instanziierenden Aufruf new PDO() ändern. Mit der alten Methode, würden Sie durch die gesamten Code zu gehen, zu ersetzen all ‚mysql_doSomething ()‘ Funktionen mit ihrem ‚pg_doSomthing ()‘ Gegenstück (immer auf mögliche Unterschiede in der Parameterbehandlung überprüft). Das gleiche wäre der Fall für viele andere unterstützte Datenbank-Engines sein.

Also auf Ihre Frage zurückzukommen, PDO im Grunde gibt Ihnen nur eine andere Art und Weise die gleichen Dinge zu erreichen, während einige Abkürzungen / Verbesserungen / Vorteile bietet. Zum Beispiel würde Entkommen automatisch in der richtigen Art und Weise geschehen, für den Datenbank-Engine benötigen Sie verwenden. Auch Parameter Substitution (verhindert SQL Injections, nicht in gezeigtem Beispiel) ist viel einfacher, so dass es weniger fehleranfällig.

Sie lesen sollten auf einige OOP Grundlagen eine Vorstellung von anderen zu bekommen Vorteile.

Andere Tipps

Ich bin nicht super vertraut mit PDO, aber es gibt einen Unterschied zwischen „Prepared Statements“ und entkam Saiten. Flüchten ist über Entfernen von nicht anerkannten Zeichenketten aus der Abfrage, aber vorbereitete Anweisungen sind über Abfrage der Datenbank, welche Art zu sagen, zu erwarten, .

Eine Abfrage hat mehrere Teile

Denken auf diese Weise davon: wenn Sie eine Abfrage in der Datenbank geben, du bist es mehrere verschiedene Dinge zu erzählen. Eine Sache könnte sein, zum Beispiel: „Ich möchte Sie wählen tun.“ Ein anderer könnte „begrenzen es Zeilen, in denen der Benutzername ist der folgende Wert“ sein.

Wenn Sie eine Abfrage als String aufzubauen und geben es an die Datenbank, es nicht weiß, zu jedem Teil, bis er das fertige String bekommt. Sie könnten dies tun:

'SELECT * FROM transactions WHERE username=$username'

Wenn es diese Zeichenfolge bekommt, hat sie es zu analysieren und zu entscheiden, „dies ist ein SELECT mit einem WHERE“.

Getting die Teile gemischt

Angenommen, einen böswilligen Benutzer Eingaben ihrer Benutzername als billysmith OR 1=1. Wenn Sie nicht vorsichtig sind, könnten Sie, dass in der Zeichenfolge setzen, was zu:

'SELECT * FROM transactions WHERE username=billysmith OR 1=1'

... das würde zurückkehren alle Transaktionen für alle Benutzer , weil 1 immer 1. Whoops gleich, haben Sie gehackt!

Sehen Sie, was passiert ist? Die Datenbank wußte nicht, welche Teile in der Abfrage erwarten, so dass es nur die Zeichenfolge analysiert. Es war nicht überrascht, dass der WHERE eine OR hatte, mit zwei Bedingungen, die es erfüllen könnte.

Keeping die Teile gerade

Wenn es nur gewußt hätte, , was zu erwarten: , nämlich ein SELECT deren WHERE hatte nur eine Bedingung, die böswilligen Benutzer nicht betrogen haben könnten.

Mit einer vorbereiteten Erklärung, können Sie es, dass die richtige Erwartung geben. Sie können Sie die Datenbank sagen: „Ich bin über Sie SELECT zu schicken, und es wird auf die Zeilen einen String WHERE username = zu beschränken, dass ich bin, Ihnen Das ist alles -. Es gibt keine anderen Teile der Abfrage. Bist du bereit? OK, hier die Zeichenfolge mit dem Benutzernamen zu vergleichen, kommt. "

Mit dieser Erwartung, würde die Datenbank nicht täuschen: es würde nur Zeilen zurück, wo die username Spalte die tatsächliche Zeichenfolge enthält ‚billysmith OR 1 = 1 ist.‘ Wenn niemand diesen Benutzernamen hat, wäre es nichts zurück.

Weitere Vorteile von Prepared Statements

Neben den Sicherheitsvorteilen, Prepared Statements haben ein paar Geschwindigkeitsvorteile:

  • Sie können mit unterschiedlichen Parametern wiederverwendet werden, die schneller sein sollte als eine neue Abfrage von Grund auf neu erstellen, da die Datenbank bereits im Grunde weiß, was sind Sie zu fragen. Es hat bereits seinen „Abfrage-Plan“ gebaut.
  • Einige Datenbanken (Postgres ist eine, glaube ich) startet eine Abfrage-Plan zu machen, sobald sie die vorbereitete Anweisung bekommen - bevor Sie tatsächlich haben die Parameter geschickt, um mit ihm zu verwenden. So haben Sie eine Beschleunigung auch auf der ersten Abfrage sehen können.

Für eine andere Erklärung finden Theo Antwort href="https://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php">.

Im Gegensatz zu mysql_real_escape_string, PDO ermöglicht es Ihnen, einen Datentyp zu erzwingen.

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

Beachten Sie, dass im obigen Beispiel, der erste Parameter, Kalorien, ist erforderlich, eine ganze Zahl (PDO :: PARAM_INT) zu sein.

Zweitens mir, PDO parametriert Abfragen sind einfacher zu lesen. Ich würde lieber lesen:

SELECT name FROM user WHERE id = ? AND admin = ? 

als

SELECT name FROM user WHERE id = mysql_real_escape_string($id) AND admin = mysql_real_escape_string($admin);

Drittens müssen Sie nicht sicherstellen, dass Parameter, die Sie zitieren richtig. PDO kümmert sich darum. Zum Beispiel mysql_real_query_string:

SELECT * FROM user WHERE name = 'mysql_real_escape_string($name)' //note quotes around param

vs

SELECT * FROM user WHERE name = ?

Schließlich PDO können Sie Port Ihre App auf eine andere db ohne Ihre PHP-Datenanrufe zu ändern.

stellen Sie sich etwas entlang der Linien von schreiben:

$query = 'SELECT * FROM table WHERE id = ' . mysql_real_escape_string($id);

Dies wird nicht von Injektionen sparen, weil $ id 1 OR 1=1 sein könnte, und Sie werden alle Datensätze aus der Tabelle erhalten. Sie müssten $ id auf der rechten Seite Datentyp (int in diesem Fall)

werfen

gU einen weiteren Vorteil hat, und das ist die Austauschbarkeit von Datenbank-Backends.

Neben SQL-Injection zu verhindern, PDO ermöglicht es Ihnen, eine Abfrage einmal vorzubereiten und es mehrmals auszuführen. Wenn die Abfrage mehrere Male (innerhalb einer Schleife, zum Beispiel) ausgeführt wird, sollte diese Methode effizienter sein (ich sage „sollte“, weil es so aussieht, dass nicht immer der Fall auf älteren Versionen von MySQL ist). Die Vorbereitung / bind-Methode ist auch mehr im Einklang mit anderen Sprachen habe ich gearbeitet habe.

  

Warum ist PDO besser zu entkommen MySQL-Abfragen / querystrings als mysql_real_escape_string?

Ganz einfach, weil „Flucht“ allein macht keinen Sinn.
Darüber hinaus ist es anders unvergleichbar Angelegenheiten.

Das einzige Problem mit Flucht ist, dass jeder nimmt es falsch, es als eine Art „Schutz“ übernehmen.
Jeder sagt: „Ich entkam meine Variablen“ mit der Bedeutung „ich geschützt meine Frage“.
Während Flucht allein hat nichts mit Schutz überhaupt zu tun.

Der Schutz kann etwa bei erreicht werden, entkam ich und meine Daten zitiert , aber es ist nicht überall anwendbar, für die Kennungen zum Beispiel (wie auch PDO, übrigens).

Also, die Antwort lautet:

  • PDO, wenn sie für die binded Werte Flucht zu tun, gilt nicht nur entkommen, sondern auch zu zitieren -. Aus diesem Grund ist es besser
  • „Flucht“ ist kein Synonym für den „Schutz“. "Umschreibungen + unter dem Stichwort" grob ist.
  • aber für einige Abfrage Teile beider Verfahren nicht anwendbar.
scroll top