Seite 1 von 2
php und SQL-Injections
Verfasst: 12.12.2005 14:53
von S2B
Moin,
ich hätte mal eine Frage in Sachen PHP und Sicherheit bei SQL-Queries.
Bei phpBB soll ja (nach
diesem Thread) das verwendet werden, um SQL-Injections vorzubeugen:
Code: Alles auswählen
// für POST/GET-Variablen:
str_replace("\'", "''", $variable_name);
// für alles andere:
str_replace("'", "''", $variable_name);
Wie sieht das bei normalen PHP-Scripts aus? Reicht es aus, wenn man die Werte durch mysql_real_escape_string() bzw. bei Zahlen durch intval() jagt oder kann es da trotzdem noch zu Problemen kommen?
Verfasst: 12.12.2005 15:31
von fanrpg
mysql_escape_string, intval reicht völlig aus. Aber das benutz ich nie ich mache immer:
Code: Alles auswählen
$inhalt = $_POST['sql_injection'];
$inhalt = stripslashes($inhalt);
$inhalt = str_replace("\\", "\\\\", $inhalt);
$inhalt = str_replace("'", "\'", $inhalt);
Nichts anderes mach mysql_escape_string().
Verfasst: 12.12.2005 15:37
von S2B
OK, alles klar, danke für die Antwort.

Verfasst: 12.12.2005 16:09
von Martin Truckenbrodt
Hallo,
durch den DBAL des phpBB lassen sich nicht alle Funktion jedes einzelnen unterstützten Datenbanksystems nutzen. Man "muß" also mit einem gemeinsamen Nenner arbeiten.
Gruß Martin
Verfasst: 13.12.2005 00:39
von IPB_Flüchtling
Ahoi,
würde das Folgende funktionieren?
$post_subject = mysql_real_escape_string($post_subject);
$post_text = mysql_real_escape_string($post_text);
$INS_posts_text = "INSERT INTO ".POSTS_TEXT_TABLE." (post_id, bbcode_uid, post_subject, post_text) VALUES ('$post_id', '$bbcode_uid', '$post_subject', '$post_text')";
mysql_query($INS_posts_text) or die("Leider ist ein Fehler aufgetreten.");
Stripslashes habe ich zusätzlich im Einsatz. Intval werde ich mir auch näher ansehen.
LG, IPB_Flüchtling
Verfasst: 13.12.2005 11:45
von LeoManiac
fanrpg hat geschrieben:mysql_escape_string, intval reicht völlig aus. Aber das benutz ich nie ich mache immer:
Code: Alles auswählen
$inhalt = $_POST['sql_injection'];
$inhalt = stripslashes($inhalt);
$inhalt = str_replace("\", "\\\", $inhalt);
$inhalt = str_replace("'", "\'", $inhalt);
Nichts anderes mach mysql_escape_string().
mysql_real_escape_string wäre sinnvoller als mysql_escape_string da es noch etwas mehr escaped
ps: warum so viel Aufwand wenn mysql_real_escape_string das gleiche bringt? ist doch unnötig

Verfasst: 13.12.2005 15:05
von fanrpg
LeoManiac hat geschrieben:ps: warum so viel Aufwand wenn mysql_real_escape_string das gleiche bringt? ist doch unnötig

Was ist wenn jemand nicht mysql verwendet?
Dann ist das schon sehr nützlich.
Verfasst: 13.12.2005 15:30
von LeoManiac
da die MySQL Extension zum standart bei PHP gehört und die Funktion im großen u. ganzen das was du da in 3 Zeilen machst - und noch mehr - in einer Funktion zusammenfasst
mal davon abgesehen hat man doch so wieso in ner einigermaßen guten Datenbankklasse sowas wie ne prepare Funktion die SQL Statements vorbereitet
Code: Alles auswählen
<?php
/** Bereitet einen SQL Befehl durch escapen der Benutzereingaben sicher vor um SQL Inejctions zu vermeiden
* @param string $SQL Ein SQL Statement
* @param array $secure_values Werte die für das Query vorbereitet werden sollen
* @exception MySQLException Verarbeitungsfehler
* @exception MySQLPrepareException Vorbereitungsfehler
*/
public function prepare($SQL, $secure_values)
{
if (!is_array($secure_values))
throw new MySQLException("param not an array");
if (!preg_match("/\?/", $SQL))
throw new MySQLPrepareException("no placeholder found");
$this->secure_values_fifo = $secure_values;
$this->prepared_string = preg_replace_callback("/\?/", array($this, "replace_secure_values_callback"), $SQL);
$this->secure_values_fifo = NULL;
}
/** Callback-Function die die Function prepare für jedes Element im Werte-Array aufrufen lässt
* @param array $treffer ist nötig, aber vollkommen unwichtig
* @exception MySQLPrepareException Vorbereitungsfehler
*/
protected function replace_secure_values_callback($treffer)
{
if (count($this->secure_values_fifo) < 1)
throw new MySQLPrepareException("not enough secure values");
return mysql_real_escape_string(array_shift($this->secure_values_fifo));
}
?>
und wenn dann noch davon ausgehen sollte das man mehrere Datenbank benutzen will/kann/möchte dann sollten sowieso die Klassen alle gleichnamige Methoden haben damit man das dann für jede Datenbank seperat handlen kann aber in 95% aller Fälle wird wohl immer ne MySQL im Spiel sein.
Verfasst: 13.12.2005 20:40
von IPB_Flüchtling
Hallo,
noch einmal die Frage: Ist die Syntax des Folgenden korrekt?
$post_subject = mysql_real_escape_string($post_subject);
$post_text = mysql_real_escape_string($post_text);
$INS_posts_text = "INSERT INTO ".POSTS_TEXT_TABLE." (post_id, bbcode_uid, post_subject, post_text) VALUES ('$post_id', '$bbcode_uid', '$post_subject', '$post_text')";
mysql_query($INS_posts_text) or die("Leider ist ein Fehler aufgetreten.");
Bitte um Auskunft, ob man das so machen kann. Oder müsste ich das mysql_real_escape_string irgendwie in die mit $INS_posts_text beginnende Zeile einbauen?
LG, IPB_Flüchtling
Verfasst: 14.12.2005 08:28
von LeoManiac
nö ist ok so
aber bastel dir lieber ne Klasse mit ner Funktion die das automatich übernimmt ist doch sonst unnötig viel code