php und SQL-Injections

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

php und SQL-Injections

Beitrag 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?
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Beitrag 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().
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

OK, alles klar, danke für die Antwort. :)
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Benutzeravatar
Martin Truckenbrodt
Mitglied
Beiträge: 1143
Registriert: 15.08.2003 23:16
Wohnort: Südthüringen
Kontaktdaten:

Beitrag 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
Advanced Block MOD 1.1.4 ist released! - Verhindere Spam auf Deinem phpBB3 Board mit Stop Forum Spam, BotScout, Akismet, Project Honey Pot und verschiedenen IP-RBL und Domain-RBL DNS Blacklisten! - Meine MODs - phpBB Complete Core
IPB_Flüchtling
Mitglied
Beiträge: 1862
Registriert: 23.12.2004 22:46

Beitrag 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
LeoManiac
Mitglied
Beiträge: 38
Registriert: 24.11.2005 18:53

Beitrag 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:
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Beitrag 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.
LeoManiac
Mitglied
Beiträge: 38
Registriert: 24.11.2005 18:53

Beitrag 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.
IPB_Flüchtling
Mitglied
Beiträge: 1862
Registriert: 23.12.2004 22:46

Beitrag 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
LeoManiac
Mitglied
Beiträge: 38
Registriert: 24.11.2005 18:53

Beitrag 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
Antworten

Zurück zu „Coding & Technik“