dedlfix: GPC-Arrays auf SQL-Injection etc. prüfen

Beitrag lesen

echo $begrüßung;

Das Escapen aller Zeichen dann, wenn sie gebraucht werden mag zwar teilweise resourcensparender sein, hat aber auch seine Nachteile und ist ein ziemlicher Aufwand, der die Lesbarkeit des PHP-Codes meiner Meinung nach doch sehr beeinträchtigt (auch, wenn es nur ein Funktionsaufruf ist).

Das letzte Argument ist ein ziemlich blödes, da es einigermaßen elegant umgangen werden kann.

Statt

$sql = 'INSERT INTO table (feld1,feld2) VALUES ("' . mysql_real_escape_string($_POST['feld1']) . '", "' . mysql_real_escape_string($_POST['feld2']) . '")';

was durch das ewige Raus-aus-dem-String/Rein-in-den-String zugegebenermaßen nicht unbedingt leicht lesbar ist könnte man

$sql = sprintf('INSERT INTO table (feld1,feld2) VALUES ("%s", "%s")',
    mysql_real_escape_string($_POST['feld1']),
    mysql_real_escape_string($_POST['feld2']));

schreiben. Oder man könnte die Möglichkeiten modernerer Datenbankschnittstellen nutzen. Beispiel mysqli:

$stmt = $mysqli->prepare('INSERT INTO table (feld1,feld2) VALUES (?, ?)');
  $stmt->bind_param('ss', $_POST['feld1'], $_POST['feld2']);

Hier kümmern sich die mysqli-Funktionen selbst sowohl um das Einrahmen von String-Werten als auch um die Entschärfung von kritischen Zeichen darin. Bei PDO sieht die Geschichte ähnlich aus (Example 6 und folgende).

Oder man schreibt sich einen eigenen Abstraktionslayer, der das gesamte Datenbankgeraffel von der eigentlichen Aufgabe des Scripts trennt, so das nur noch ein übersichtliches

$daten = array(
  'feld1' => $_POST['feld1'],
  'feld2' => $_POST['feld2']);
try {
  $datenbankhandle->insert('table', $daten);
} catch (Exception $ex) {
  // Fehlerbehandlung
}

übrigbleibt.

echo "$verabschiedung $name";