Warum ist mysql_real_escape_string nicht mehr sicher?

... komplette Frage anzeigen

2 Antworten

Der Umstieg von mysql_query zu PDO war für mich anfangs auch etwas verwirrend, aber im Endeffekt ist es einfach umzusetzen.

Datenbankverbindung wird so hergestellt:

$dbuser="USERNAME";
$dbpass="PASSWORT";

// PDO Connect
$dbh = new PDO('mysql:host=localhost;dbname=DATENBANKNAME', $dbuser, $dbpass);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

// Restlicher PHP Code usw.

// Verbindung wieder schließen. (am Ende der Seite)
$dbh = null;

Um MySQL-Injections zu vermeiden, muss man auch PDO richtig anwenden, denn mit einfachem PDO->query(); ist dies noch immer möglich.

An Stellen, wo Formulareingaben (Nutzereingaben) an eine DB geschickt werden sollen, musst das Prepared Statement verwendet werden:

$sth = $dbh->prepare("INSERT INTO tabelle (spalte1, spalte2, spalte3) VALUES (:bla, :bli, :blu)"); // :bla, :bli und :blu etc. sind Placeholder, die dann eine Injection vermeiden.
$sth->execute(array('bla' => $wert, 'bli' => $_POST['iwas'], 'blu' => $_GET[nochwas])); // führt den Query aus und ersetzt die Placeholder mit den gewünschten Werten.

An Stellen, wo keine Nutzereingaben verwendet werden, kannst du weiterhin wie auch bei mysql_query() das PDO->query() Statement nutzen:

$sth = $dbh->query("INSERT INTO  usw.");

Wenn du von beidem was hast, kannst du natürlich die serverseitigen Daten auch schon anstelle der Placeholder verwenden:

$sth = $dbh->prepare("INSERT INTO tabelle (spalte1, spalte2, spalte3) VALUES (:bla, '$wert', :blu)");
Antwort bewerten Vielen Dank für Deine Bewertung

mysqlrealescape_string war mal sicher? es gibt so viele möglichkeiten, das ding zu knacken, denke, das geht sogar mit base64

ohne einen code-schnipsel kann dir keiner sagen, was kaputt ist, für gewöhnlich funktionieren PDOs wunderbar....

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?