Urs: Sicherheits behandlung von Variablen bei PDO Datenbank Abfragen

Hallo,

ich versuche gerade in pdo einzusteigen. Ich habe gelesen, das dies ja die ganze Datenbank abfrage sicherer machen soll. Jetzt habe ich diesen Teil einen Scriptes und das einzige was bei einem übergebenen String behandelt wird ist trim. Muss eine VAR noch weiterbehandelt werden zu Sicherheit oder erledigt das das PDO, um sie in der Datenbank abzuspeichern?


if(isset($_GET['save'])) {
$save = $_GET['save'];

if($save == 'personal_data') {
$vorname = trim($_POST['vorname']);
$nachname = trim($_POST['nachname']);

$statement = $pdo->prepare("UPDATE users SET vorname = :vorname, nachname = :nachname, updated_at=NOW() WHERE id = :userid");
$result = $statement->execute(array('vorname' => $vorname, 'nachname'=> $nachname, 'userid' => $user['id'] ));
}}
  1. Hallo Urs,

    wenn Du mit prepared statements und Host-Variablen arbeitest, kümmert sich PDO um die kontextgerechte Behandlung. Du musst nichts weiter tun.

    Aber:

    • den Doppelpunkt musst Du mit in die Array-Keys übernehmen (siehe die Beispiele zu Execute)
    • du brauchst keine Temp-Variablen. Du kannst beim Erzeugen des Parameter-Array direkt $_POST-Elemente angeben, z.B. so:
    $result = $statement->execute(
        array(':vorname' => $_POST['vorname'],
              ':nachname'=> $_POST['nachname'],
              ':userid'  => $user['id'] ));
    

    Du kannst Dir auch noch überlegen, auf die neuere Notation für Arrays umzusteigen (seit PHP 5.4):

    // alt:
    ARRAY(':vorname' => $_POST['vorname'], ':nachname'=> $_POST['nachname'], ':userid' => $user['id'] )
    // neu:
    [':vorname' => $_POST['vorname'], ':nachname'=> $_POST['nachname'], ':userid' => $user['id']]
    

    Rolf

    --
    sumpsi - posui - clusi
    1. blöde Frage!

      Es funktioniert aber auch ohne den Doppeltpunkt.

      Es funktinoert ohne

      'vorname' => $vorname,

      und mit

      ':vorname' => $vorname,

      $statement = $pdo->prepare("UPDATE users SET vorname = :vorname, nachname = :nachname, updated_at=NOW() WHERE id = :userid");
      $result = $statement->execute(array('vorname' => $vorname, 'nachname'=> $nachname, 'userid' => $user['id'] ));