Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Problem Übergabeparameter mit GET, Zeichen

  1. #1
    Registrierter Benutzer
    Registriert seit
    09.02.2007
    Beiträge
    22

    Problem Übergabeparameter mit GET, Zeichen

    Hallo!

    Ich hole mir per PHP Script eine SQL Query rein:
    PHP-Code:
    $query=$_GET['query'];
    $query=urldecode($query); 
    $inhalt=eregi_replace("\\","",$query); 
    Leider wird mir bei folgendem Statement:
    "SELECT * from emp where job='manager';"

    die einfachen hochkomma beim manager als \ weiterverwendet, wodurch dann das Statement als falsch ausgewertet wird:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'manager\'' at line 1

    Wie kann ich diese Backslash anders interpretieren, sodass der STRING exakt so ankommt wie oben beschrieben?
    MFG
    Klaus

  2. #2
    Registrierter Benutzer
    Registriert seit
    25.12.2004
    Beiträge
    217
    Hallo Klaus,

    ich vermute mal, dass Magic Quotes aktiviert sind. Diese sorgen dafür, dass jeder Parameter der an dein PHP-Skript gesendet wird, automatisch "escaped" d.h. vor bestimmten Zeichen ein \ eingefügt wird.

    Magic Quotes ist dazu da, um die Chancen auf SQL-Injections zu verringern. Da fortgeschrittene Programmierer allerdings die Prüfung der Eingabeparameter gerne selbst übernehmen, stören Magic Quotes oftmals.

    Lösen kannst du dein Problem, indem du abfrägst ob Magic Quotes aktiviert sind und gegebenenfalls mittels stripslashes() die ungewollt "escapeden" Zeichen wieder zurückwandelst. Einen Code-Schnipsel dazu gibt es schon im Manual unter:
    "Disabling magic quotes at runtime" http://de.php.net/manual/de/security....disabling.php

    Da ich nicht davon ausgehe, dass so etwas wie PHPMyAdmin oder ein ähnliches Tool programmieren willst, das zur Administration von Datenbanken genutzt wird, rate ich dir dringend auf die Übergabe eines SQL-Befehls über die Parameter zu verzichten!
    Was machst du, wenn jemand statt deinem erwarteten SQL-Query ein DELETE-Statement schickt?
    PHP-Code:
    script.php?query=DELETE FROM emp WHERE 1=
    Über eine solche Lücke kann deine komplette Datenbank kompromittiert werden - je nach Sicherheitseinstellungen auch das komplette System.

    Weitere Infos zur PHP Sicherheit:
    http://de.php.net/manual/de/security.php
    http://www.google.de/search?q=php+sicherheit

    Grüße,
    nEox

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.02.2007
    Beiträge
    22
    Hallo Danke für den Tipp!

    Soll nur zum Üben sein, ich schau mit substr() nach, ob das Statement mit select startet..
    falls nicht, gebe ich eine Fehlermeldung aus.
    mfg
    Klaus

  4. #4
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Was machst Du bei "SELECT 1=1; DROP ALL TABLES;"?
    Homepage: www.pingu.info

  5. #5
    Registrierter Benutzer
    Registriert seit
    25.12.2004
    Beiträge
    217
    Hallo Klaus,

    diese Prüfung wird dir kaum Sicherheit verschaffen (siehe Post von Pingu).

    Wenn du das Skript nur zur Übung schreibst - schreib es doch gleich sicher... dann kannst du beim nächsten Projekt auf dieses Skript zurückgreifen und läufst nicht Gefahr eine (wirklich grobe) Sicherheitslücke blind zu übernehmen.

    Übergib doch einfach den wirklich benötigten Parameter an dein Skript:
    PHP-Code:
    script.php?job=manager 
    Wenn du jetzt noch $_GET['job']/$_POST['job'] auf gültige Werte überprüfst und dann das SQL-Satement zusammenbaust, hast du die Möglichkeit auf einen Angriff sehr stark eingeschränkt.
    PHP-Code:
    $possibleJobs = array('manager''programmer''handyman');

    if (!
    in_array($_GET['job'], $possibleJobs)) {
        die(
    'Wrong parameter value for: job');
    }
    ... 
    Grüße,
    nEox

  6. #6
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von klaus1 Beitrag anzeigen
    Hallo!

    Ich hole mir per PHP Script eine SQL Query rein:
    PHP-Code:
    $query=$_GET['query'];
    $query=urldecode($query); 
    $inhalt=eregi_replace("\\","",$query); 
    Leider wird mir bei folgendem Statement:
    "SELECT * from emp where job='manager';"

    die einfachen hochkomma beim manager als \ weiterverwendet, wodurch dann das Statement als falsch ausgewertet wird:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'manager\'' at line 1

    Wie kann ich diese Backslash anders interpretieren, sodass der STRING exakt so ankommt wie oben beschrieben?
    MFG
    Klaus
    vorsicht mir urldecode, dadurch kann ein angreifer ganz einfach magic_quotes umgehen. Normalerweise brauchst du das auch gar nicht.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •