PDO Daten validieren, filtern und vordefinierte Konstanten

Registrierer

Erfahrenes Mitglied
Ich stelle gerade eine Anwendung auf PDO um und hab da noch Unsicherheiten bzgl. der vordefinierte Konstanten.
Was macht z. B. PDO::PARAM_INT genau?
Es verhindert nicht, dass ein String übergeben wird.
Ich müsste hier also noch z. B. intval() benutzen um wirklich sicher zu gehen, dass ein Integerwert übergeben wird.

Für was also genau ist das gut?

PHP:
<?php
$pdo = new PDO('sqlite:users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Automatically sanitized by PDO
$stmt->execute();
?>
 
Ich denke, es dient dazu um der DB genau zu sagen was da kommt.
"9" ist für eine DB nicht da gleiche wie 9
Mit PARAM_INT weiss die DB, das es ein Integer ist und kann es entsprechend behandeln
 
Grad bei deinem Beispiel weiss so die DB, dass sie ein Zahlenvergleich machen muss und nicht ein String-Vergleich.
 
Na gut, das Beispiel war blöd gewählt.
Es geht mir mehr um das Einfügen, Löschen und Aktualisieren der DB.
Also müssen alle bisherigen Filter und Validierungen erhalten bleiben.

Da z. B. quote() kein vollwertiger Ersatz für mysql_real_escape_string() ist, muss man hier ja noch genauer hinsehen als früher. Sehe ich das richtig?
 
Funktioniert ja auch nicht mehr.

Sollte das jetzt ausreichen?

PHP:
<?PHP
$string = '"teststring" mit allen \blaahs\?';

$stmt=$pdo->prepare("INSERT INTO tabelle (feld1) VALUES (:feld1)");
$pdo->quote($stmt->bindValue(':feld1',$string, PDO::PARAM_STR));
$stmt->execute();
?>
 
Gegen SQL-Injection bist du damit jedenfalls sicher.

Ich glaube, das ist eine gängige Fehlannahme bei SQL-Injections. Es geht lediglich darum, dass die Werte so wie sie kommen auch in der Datenbank ankommen und nicht durch etwaige Zeichen (" ' ; ) gleich die ganze Abfrage zerhauen bzw im schlimmsten Fall eben einem Hacker Zugriff auf die DB zu geben.

Die Daten an sich werden nicht validiert oder so. Also jetzt mal ganz primitiv: Ein hacker kann dort immernoch seinen Virus sourcecode reinschreiben und der kommt auch so in die Datenbank und normerweise auch funktionierend wieder raus ;) Das ist dann aber eben eine andere Baustelle. (Beispiel wäre einschleusen von HTML oder JS-Code, der ungefitert wieder ausgegeben wird).
 
Zuletzt bearbeitet:
Wozu quote()? Wenn du mit prepared Statements arbeitest brauchst du das nicht. Egal ob String oder Int oder Datum.
Du brauchst das nur, wenn du dein SQL von Hand zusammenbastelst.

If you are using this function to build SQL statements, you are strongly recommended to use PDO::prepare() to prepare SQL statements with bound parameters instead of using PDO::quote() to interpolate user input into a SQL statement. Prepared statements with bound parameters are not only more portable, more convenient, immune to SQL injection, but are often much faster to execute than interpolated queries, as both the server and client side can cache a compiled form of the query.
 
Zurück