kostenloser Webspace werbefrei: lima-city


Sicherheits-Frage

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    pixilab

    Kostenloser Webspace von pixilab

    pixilab hat kostenlosen Webspace.

    Hallo, ich habe eine PHP-Methode geschrieben, die eine Benutzereingabe entgegennimmt und daraus ein MySQL-Querry zusammenbaut, der dann ausgeführt wird. Ich wollte euch fragen ob das gegen Angreifer sicher wäre wenn ich die Eingabe des Benutzers dann nur auf diese Weise prüfe?

    $eingabe_escaped = mysql_real_escape_string($eingabe);
    $mein_query = "SELECT FROM ... {$eingabe_escaped} ...";
    ...
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Wichtig ist, dass die
    $eingabe_escaped
    auch in Anführungszeichen (
    '
    ) in der Query landet:
    $eingabe_escaped = mysql_real_escape_string($eingabe);
    $mein_query = "SELECT FROM ... WHERE xxx = '{$eingabe_escaped}' ...";
    Ansonsten nützt dir das escapen gar nichts...
  4. Autor dieses Themas

    pixilab

    Kostenloser Webspace von pixilab

    pixilab hat kostenlosen Webspace.

    Ich würde gerne nur Lese-Zugriffe erlauben, deswegen möchte ich nach bößwilligen Wörtern prüfen. Wie würde das in meiner Methode aussehen?

    F1: Gibt es eine Methode, die nach mehreren Begriffen prüfen kann, mit preg_match geht es z.B. nicht
    F2: Was gibt es denn sonst noch für bösartige Begriffe, nach denen man prüfen kann, mir fallen leider nicht viele ein.

    private function getSequreInput($input) {
    		$input_escaped = mysql_real_escape_string($input);
    		
    		$not_allowed = array('DELETE', 'REPLACE');
    				
    		if(preg_match($not_allowed, $input_escaped)){
    			return ' ';
    		} else {
    			return $input_escaped;
    		}
    
    	}


    EDIT: Hier ist meine etwas verbesserte Methode. Bin für Verbesserungen offen. Ich erwarte als Eingabe eigentlich nur Buchstaben Eckige Klammern und Doppelpunkte. Später evtl auch Datum

    private function getSequreInput($input) {
    		
    		# String escapen
    		$input_escaped = mysql_real_escape_string($input);
    		
    		# Unerwartete Wörter filtern
    		$bannedWords = array('DELETE', 'INSERT', 'OR', 'AND');
    		
    		foreach ($bannedWords as $bannedWord) {	
    			if(strpos($input_escaped, $bannedWord)){
    				return ' ';
    			} else {
    				return $input_escaped;
    			}
    		}
    	}


    Beitrag zuletzt geändert: 28.6.2012 12:54:48 von pixilab
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    pixilab schrieb:
    Ich würde gerne nur Lese-Zugriffe erlauben, deswegen möchte ich nach bößwilligen Wörtern prüfen. Wie würde das in meiner Methode aussehen?
    Was hast du bitte vor? Wenn du nur eine SELECT-Abfrage mit WHERE beschränken möchtest kannst du dir das alles sparen, dann reicht mysql_real_escape_string. Wenn du den User eine SQL-Abfrage eingeben möchtest (das ist nicht zu empfehlen), dann wirst du um das Filtern nicht herumkommen...

    Also das hier wäre schon sicher:
    $data = mysql_real_escape_string($_POST['data']);
    $query = "SELECT * FROM tabelle WHERE data = '$data'";
    $result = mysql_query($query);
    Durch das escapen der Eingabe und die Anführungszeichen in der Query (
    '
    ) ist es unmöglich eine SQL-Injection durchzuführen vor der du dich ja schützen möchtest. Wenn in $_POST['data'] z.b.
    '
    oder
    OR
    oder sonst was stünde, würde einfach danach in der Tabelle gesucht werden aber der "böse Code" wird nie ausgeführt.

    Falls du noch Rechenpower verbraten möchtest und die Eingabe auf normale Wörter wie "DELETE" überprüfen willst kannst du trotzdem preg_match verwenden... als Pattern einfach
    /wort-1|wort-2|wort-3|blabla/i
    verwenden und es sollte funktionieren (F1).

    Alle weiteren "bösartigen Begriffe" findest du im Handbuch von MySQL (F2)

    Nachdem du ja nur bestimmte Zeichen zulassen willst bietet sich preg_match wieder an...
    $pattern = '/^[0-9a-zA-Z\[\]:]*$/';
    if(!preg_match($pattern, $input))
    	echo('böse!');
    else
    	echo('gut');
  6. Autor dieses Themas

    pixilab

    Kostenloser Webspace von pixilab

    pixilab hat kostenlosen Webspace.

    hackyourlife schrieb:
    Was hast du bitte vor? Wenn du nur eine SELECT-Abfrage mit WHERE beschränken möchtest kannst du dir das alles sparen, dann reicht mysql_real_escape_string. Wenn du den User eine SQL-Abfrage eingeben möchtest (das ist nicht zu empfehlen), dann wirst du um das Filtern nicht herumkommen...


    Ach so, bin ein wenig über vorsichtig, dann lass ich die Prüfung nach INSERT usw besser weg. Wie ist es, wenn die Doppelpunkte und Eckigen Klammern 2xHIntereinander vorkommen müssen, also [[test1::text]][[test2::text]] aber nicht [test:text][test:text]. Würde es so stimmen? \^[0-9a-zA-Z\[{2}\]{2}:{2}]*$\

    private function getSequreInput($input) {
             
            # String escapen
            $input_escaped = mysql_real_escape_string($input);
             
            # Nach erlaubten Zeichen filtern
            $pattern = ' \^[0-9a-zA-Z\[{2}\]{2}:{2}]*$\';
            if(!preg_match($pattern, $input))
                    return ' ';
             } else {
                    return $input_escaped;
             }
            
        }


    EDIT: Habs schon, mit einem RegEx Tool kann man das sehr einfach aufbauen und gleich testen. Habs in php übersichtshalber mit Variablen gemacht. Wenn man das Ding zusammenbaut ist es ein Mords-Ding, nur um meine lustige Klammer-Eingabe zu prüfen. Hier wird aber nicht mehr einfach nach Zeichen, sondern nach einem Eingabemuster geprüft. Hoffentlich ist das jetzt sicher genug.

    /^([\[]{2}([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)[\:]{2}([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)(([\s]?[\(]([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)[\s]?[\)])?)[\]]{2})((([\|]{2})?[\[]{2}([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)[\:]{2}([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)(([\s]?[\(]([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)[\s]?[\)])?)[\]]{2})*)$/


    Beitrag zuletzt geändert: 28.6.2012 19:12:37 von pixilab
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!