PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL-Codeinjection mit "htmlspecialchars" verhindern?


ezzemm
2009-07-27, 11:32:19
Hallo zusammen!

Bei meinem aktuellen Projekt programmiere ich zum ersten Mal eine Schnittstelle, wo Nutzer Daten über ein Formular in eine SQL-Datenbank abspeichern können. Daher muss ich mich jetzt da mit dem Thema Sicherheit befassen.

Ich habe schon entsprechende Seiten gelesen (http://www.oreilly.de/artikel/php_sicherheit.html); aber dort wird "magic_quotes_gpc" bzw. "addslashes" empfohlen, was ich ziemlich unhandlich finde.
Ich würde das gerne mit "htmlspecialchars" regeln, weil meine eigenen Tests nur mit gespeicherten Strings in der DB endeten und ich z.B. kein Löschen der DB auslösen konnte.

Wie seht ihr das? Ist diese Methode sicher oder ist auch die anfällig für Code-Injection?

$sql = '
UPDATE
'.$db_prefix.'clients
SET
Name = "'.htmlspecialchars($_POST["Name"]).'",
Strasse = "'.htmlspecialchars($_POST["Strasse"]).'",
Zusatz = "'.htmlspecialchars($_POST["Zusatz"]).'",
Plz = "'.htmlspecialchars($_POST["Plz"]).'",
Ort = "'.htmlspecialchars($_POST["Ort"]).'",
WHERE
ID = '.check_decimal_number($_POST['ID']).'
';

PS: In der Funktion check_decimal_number() überprüfe ich ob auch eine Zahl übermittelt wurde, ansonsten wird das Skript beendet.

darph
2009-07-27, 12:04:47
Ich nutze sprintf() und mysql_real_escape_string().

Das scheint mir sicher genug durch die Typüberwachung in sprintf und den Escapes in der sql-spezifischen Funktion.


public function insertRegistrationKey($id, $key) {
$query = sprintf("INSERT INTO registrationkey VALUES(%d, '%s');",
mysql_real_escape_string($id),
mysql_real_escape_string($key));
self::query($query);
}


htmlspecialchars schützt ja nur die Darstellung deiner Website (in den Kommentaren kein HTML einfügen) nicht aber so sehr deine DB.

dav133
2009-07-27, 13:49:03
Schau dir mal PDO an, das ist die "neue", objektorientierte Art des Datenbankzugriffs mit PHP. Vorteil: Prepared Statements, du sagst also, welche Parameter welchen Datentyps in die DB wandern, SQL Injection ist somit kein Problem mehr. Weitere feine Sachen sind damit auch noch machbar, du könntest theoretisch die Datenbank von mysql auf postgresql auf sqlite auf wasweissichnichtsql änden, ohne einen Fetzen Code anfassen zu müssen, da das alles "PDO"-intern geregelt wird. Mir hat damals diese Anleitung sehr geholfen: http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html

lg

rotalever
2009-07-27, 15:31:04
Magic quotes sind ganz schlecht.
htmlspecialchars sind für die Ausgabe gedacht und sollten da auch immer genutzt werden (um cross site scripting etc. zu verhindern).

Für SQL entweder wie schon angesprochen mysql_real_escape_string verwenden oder noch besser parametrized oder prepared statements mit Parametern verwenden.

Außerdem ist es bei htmlspecialchars wohl ratsam die Flag ENT_QUOTES zu verwenden und wenn man UTF-8 verwendet auch noch das charset anzugeben.

Und dann habe ich da noch mal was auf einer Internetseite gefunden:
http://blog.php-security.org/archives/76-Holes-in-most-preg_match-filters.html

ezzemm
2009-07-27, 21:42:14
Danke für eure Antworten, hat mir sehr viel geholfen :)