Portal > Foren > Datenbanken, Server, Betriebssysteme und sonstige Programmiersprachen > Datenbanken > SQL-Injection - Nicht jeden Wert überprüfen, sondern ganze Queries
Antwort
 
Themen-Optionen
Alt 14.11.2006, 19:11 Nach oben    #1
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard SQL-Injection - Nicht jeden Wert überprüfen, sondern ganze Queries

Hi,

ich überlege mir gerade, wie ich mittels einer Methode eine SQL-Injection verhindern kann.
Also nicht eine Methode, die ich bei jedem einzutragenden Wert nutze, sondern die einen kompletten Query incl eventueller Subqueries, Joints und Unions "scannt" und eben den Standard

PHP-Code:
  private function secure($value) {

   if(
get_magic_quotes_gpc())
     
$value stripslashes($value);

   if(!
is_numeric($value))
     
$value "'".mysql_real_escape_string($value)."'";

    return 
$value;
  } 
anwendet.

Ich würde das mit pattern angehen - allerdings wollte ich erstmal eure Meinung hören, ob das von der Performance her überhaupt zu empfehlen wäre.

Ich bin unschlüssig, da ich denke, dass dann pro Query eben ne menge Arbeit auf den Interpreter zukommt.
__________________
Vive la France! Welcome to Sarkoworld...
ljungi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.11.2006, 19:23 Nach oben    #2
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
Standard

wie wäre es einfach alle "fremden" werte sauber zu escapen mittels mysql_real_escape_string ?
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.11.2006, 19:40 Nach oben    #3
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Hi.

Erstmal ist deine "Standard"-Methode Käse, denn die eine Operation wird (zumindest so ähnlich) gemacht, um eingehende Werte wieder in den Zustand zu versetzen, in dem sie eigentlich erwatet würden und die zweite betrifft dann das Escaping für eine MySQL-Query. Gehört also mal garnicht zusammen.

Weiter ist das so nicht umsetzbar, wie du dir das vorstellst (wenn ich dich richtig verstehe). Das Ding ist doch, dass deine Queries eine bestimmte Struktur haben, in die Werte eingepflanzt werden. Damit die Werte die Struktur nicht ändern, verwendest du eben mysql_real_escape_string(). Wenn du nun erst die Werte einsetzt, um dann die Struktur zu analysieren, haben die Werte die Struktur womöglich bereits verändert.

Ich benutze einfach eine query-Methode in der Datenbank-Klasse, der ich a) die Query mit Platzhaltern und b) ein Array mit den Werten übergebe. Siehe auch PDO und mysqli (prepare).

Basti

Geändert von Basti (14.11.2006 um 19:42 Uhr).
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.11.2006, 19:53 Nach oben    #4
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard

Danke,

werde es also wie üblich machen und jeden Wert einzeln abfragen.

@Basti,
habe mir vorhin während meines Posts was über PDO durchgelesen. Scheint sinnvoll zu sein, allerdings müsste ich dafür mein gesamtes System umkrempeln - was mir jetzt zu viel Arbeit wäre.

Für das nächste Projekt werd ich mir das mal überlegen, auch das mit dem Query mit Platzhaltern klingt gut - ist aber auch wieder ne Sache der Uumgewöhnung
__________________
Vive la France! Welcome to Sarkoworld...
ljungi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.11.2006, 22:27 Nach oben    #5
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Also ich gewöhne mich gerne daran, einen Funktionsaufruf auszulagern, den ich andernfalls Dutzende von Malen von Hand aufrufen müsste.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.11.2006, 08:45 Nach oben    #6
Jonas
 
Benutzerbild von Artemis
 
Registriert seit: 03.06.2006
Beiträge: 240
Standard

Zitat:
Zitat von Basti Beitrag anzeigen
a) die Query mit Platzhaltern und b) ein Array mit den Werten übergebe
Wäre dann eine Funktion, die so aussieht ok/vernünftig:
PHP-Code:
<?php

function get_secure_query_string($query$values)
{
    
$secure_values = Array();
    
$secure_values[] = $query;
    foreach(
$values as $value)
    {
        
$secure_values[] = mysql_real_escape_string($value);
    }
    
$secure_query_string call_user_func_array('sprintf'$secure_values);
    return 
$secure_query_string;
}

?>
Die wird dann meinetwegen so aufgerufen:
PHP-Code:
<?php

$secure_query_string 
get_secure_query_string("UPDATE `table` SET `name` = '%s', `password` = '%s', `alter` = %d WHERE `id` = %d"$_POST['name'], sha1($_POST['password']), intval($_POST['alter']), intval($_POST['id']));

?>
__________________
Applikations-Programmierung:
BlitzMax, BlitzPlus

Webentwicklung:
PHP, (X)HTML, CSS, JavaScript, MySQL



Geändert von Artemis (15.11.2006 um 08:50 Uhr).
Artemis ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.11.2006, 10:20 Nach oben    #7
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Diesen Extra-Schritt kannst du dir doch komplett sparen.

Bei mr sieht das verkürzt so aus:
PHP-Code:
class MysqlConnection implements IConnection
{
    public function 
query($sQuery$aValues = array())
    {
        
$aValues array_map('mysql_real_escape_string'$aValues);

        
$sQuery vsprintf($sQuery$aValues);

        
$this->rResult mysql_query($sQuery$this->rHandle);

        
// ...
    
}
}


class 
Dao_User ...
{
    public function 
get($sUserName)
    {
        
$sQuery "
            SELECT
                username,
                password,
                email,
                sex,
                title,
                first_name,
                last_name,
                street_address,
                zip,
                city,
                phone,
                fax

            FROM
                users

            WHERE
                username = '%s'
            "
;

        
$this->Connection->query($sQuery, array($sUserName));

        return 
$this->Connection->fetch();
    }

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.11.2006, 20:27 Nach oben    #8
Benutzer
 
Registriert seit: 24.10.2006
Beiträge: 90
Standard

Ehrlich gesagt wenn man jetzt nicht unbedingt die schier unendlichen mysqli_*, oci_* ... Funktionen benötigt, weil man total auf eine Datenbank optimiert so sollte auf jeden Fall PDO verwendet werden. PDO bietet für fast alle Datenbanken native Treiber an.

Bei PDO hast du auch Prepared Statements (mysqli überigens auch). Verwendest du die und verwendet deine Applikation die gleiche Zeichenkodierung wie die Datenbank so hast du alles gemacht um dich vor SQL Injections zu schützen.

Sachen mit mysqli_real_* sind IMHO nervend. Außerdem ist die Gefahr groß einmal mysql_real_* zu vergessen und schon hast du ne Schwachstelle.

MfG Byrel
Byrel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2006, 12:36 Nach oben    #9
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

...wenn du ein DAOs, wie das hier oben benutzt, kannst du die Connection-Klasse dahinter beliebig austauschen (mysql -> mysqli -> pdo -> ...). Wichtig ist halt, dass du TransferObjects zurück gibst, die vom eigentlich zurückgegebene Datenformat unabhängig machen und das Ergebnis hinter einer einheitlichen Schittstelle kapseln.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zugriff auf Wert des vorhergenden Datensatzes in einer SQL Abfrage Jay Datenbanken 5 17.07.2006 15:25
sql injection robo47 Plauderecke 3 18.05.2006 16:24
Modifier haben einen Wert, obwohl keine gedrückt sind materthron Desktop-Applikationen und Grafik 3 06.11.2005 16:28


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:47 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44