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 :roll:

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 :roll:
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