echo $begrüßung;
Ich wollte jetzt nicht extra einen neuen Beitrag erstellen und hoffe, daß dieses Posting hier jetzt noch von wem gesehen wird. :-)
Na klar.
Mir ist hier geraten worden, Daten, die ein User über ein Formular eingegeben hat, zu überprüfen, bevor die Daten an die DB weitergegeben und gespeichert werden, um mich gegen SQL Injection und andere Bösartigkeiten zu schützen.
Ich habe mich da jetzt schlau gemacht und würde die Sache folgendermaßen lösen : Angenommen, einer der über ein Formular per "POST" übermittelten Werte ist der Wert "$beispielwert". Dann folgender Code : [...]
$beispielwert=$_POST['beispielwert'];
$beispielwert=strip_tags($beispielwert);
if(get_magic_quotes_gpc())
{$beispielwert=stripslashes($beispielwert);}
if(!is_numeric($beispielwert))
{$vorname="'".mysql_real_escape_string($beispielwert)."'";}
Die Reihenfolge wäre zu ändern. Zuerst sollten die eventuallen Auswirkungen von Magic Quotes entfernt werden, da dies als letztes hinzugefügr wurde, bevor PHP die Daten an den Script übergeben hat. Ich würde das mit der [im Handbuch angeführten Funktion](http://de.php.net/manual/en/security.magicquotes.disabling.php) generell und für alle Eingabedaten einmalig am Scriptanfang durchführen. Das kann man dann leichter entfernen, wenn man später auf PHP6 umsteigt.
> $beispielwert=$\_POST['beispielwert'];
Das Anlegen einer extra-Variable ist immer noch ein unnötiger Zwischenschritt.
> $beispielwert=strip\_tags($beispielwert);
strip\_tags() ist eine ["grobe Wildsau"](/archiv/2006/4/t128030/#m826560). Es ist nicht unbedingt nötig, diese Funktion anzuwenden. Der Datenbank sind die Tags egal. Bei der Ausgabe solltest sowieso dem Ausgabemedium entsprechend kodieren, so dass die Tags keinen Schaden anrichten können. Für HTML gibt es da htmlspecialchars().
> if(!is\_numeric($beispielwert))
> {$vorname="'".mysql\_real\_escape\_string($beispielwert)."'";}
SQL ist eine Text-Schnittstelle. Auch Zahlenwerte werden als String übertragen und müssen geparst werden. Es ist dabei unerheblich, ob sie in '' oder "" oder ohne dastehen. Du kannst sie also generell auch wie die anderen benutzereingegebenen Stringwerte behandeln.
Meine Empfehlung zusammengefasst lautet:
- Magic Quotes-Behandlung am Scriptanfang
- wenn nötig Plausibilitätsprüfung der eingegebenen Daten
- SQL-Statements in der Form:
~~~php
$sql = sprintf('SELECT ... FROM foo WHERE feld1="%s" AND feld2="%s"',
mysql_real_escape_string($_POST['feld1']),
mysql_real_escape_string($_POST['feld2']));
1.) Ist das der ideale und richtige Weg, [...]
Noch hübscher allerdings wäre die Verwendung der mysqli-Erweiterung oder PDO. Beide Systeme bieten eine Datenbindung an das vorbereitete, mit Platzhaltern versehene Statement, und kümmern sich selbständig um die richtige Maskierung der Variableninhalte.
http://de.php.net/manual/en/function.mysqli-stmt-bind-param.php
http://de.php.net/manual/en/ref.pdo.php#pdo.prepared-statements
echo "$verabschiedung $name";