Sql-Injection bei include ?

  • Hallo ;)
    Habe mal eine Frage.
    Also ich baue meine Seite mit include auf und mit Get...
    die Seite heißt das z.b.:

    Code
    www.xxxxxx.de/index.php?include=gästebuch

    Logisch das man dann zu der Seite kommt wo das Gästebuch ist.
    Der Code sieht dann ungefähr so aus.

    Code
    <?PHP
    
    
    $file = $_GET["include"];
    
    
    include('www.xxxxxx.de/include/$file.php')
    
    
    ?>

    Meine Frage jetzt,
    ist diese Methode anfällig,
    und wenn ja wo kann ich am besten was dagegen machen, weil wenn ich es mit
    '".mysql_real_escape_string($file)."' mache klappt es nicht.
    Und wenn ich direkt am anfang :
    $file = '".mysql_real_escape_string($_GET['include'])."';
    Kommt auch eine Fehlermeldung:

    Parse error: syntax error, unexpected T_INCLUDE in xxxxxx/index.php on line 3

    Ideen
    :roll:

  • Ein include mit http://www.? Wieso das? Und was hat dieser Parameter mit MySQL zu tun? Wie man das richtig macht, wurde hier schon mehrfach besprochen.

    $file = '".mysql_real_escape_string($_GET['include'])."';

    Was soll '" und "'??

  • und wie das anfällig ist!
    übergiebt man als parameter: ../index.php und schon ist die ganze seiten-struktur im a****

    machs am besten so:

    Code
    $file = htmlentities($_GET['include']);
    switch ($file) {
    case 'gbook':
    $include = 'gbook.php';
    break 1;
    default:
    $include = 'home.php';
    break 1;
    }
    require('include/'.$include);

    noch zwei tipps: verwende wenn möglich diese konstruktion:
    'text '.$variable.' text'
    sie läuft minimal schneller und ist weniger fehleranfällig als die hier:
    "text $variable text"

    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC ;)

  • Zitat von Greg10


    noch zwei tipps: verwende wenn möglich diese konstruktion:
    'text '.$variable.' text'
    sie läuft minimal schneller und ist weniger fehleranfällig als die hier:
    "text $variable text"


    Das kann ich mir nicht vorstellen. Was soll daran fehleranfällig sein und wie kommst du darauf, dass deine Version minimal schneller ist?

  • es IST minimal schneller ich habe gelesen ein großes projekt, dass mit der zweiten syntax arbeitete lief schneller nachdem auf die erste syntax umgestellt wurde. Grund:
    bei " muss er die gesamte ersetzungs-funktion durchlaufen lassen mit fehleranfällig meine ich, dass z.b. eine variable schneller falsch geschrieben wird, hätte man z.b. bei meinem beispiel ein leerzeichen vergessen würde er nach der variable "variabletext" suchen ;)

    ich habe das sql einfach aus dem zusammenhang gestrichen, da es hier nicht hingehört und mich nur auf seinen post bezogen, nicht auf den titel

    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC ;)

  • Davon abgesehen sollte diese Praxis alleine der Übersicht für die Programmierer immer eingehalten werden. Unser Architekt würde uns erschlagen, wenn wir anfangen würden in Strings einfach Variabeln zu verwenden.

    Sämtlicher Code erhebt keinen Anspruch auf syntaktische Korrektheit geschweige denn Ausführbarkeit und ist für die Implementation außerhalb der Beispiele nicht geeignet.
    [Blockierte Grafik: http://www.snippr.de/social/img/logo.png]
    Kein Support für kommerzielle Scripts | Kein kostenloser Support via ICQ

  • ja es ist extrem anfällig und ja es war absolut klar dasses das ist.
    nimm einfach die switch-methode die ist sehr sicher

    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC ;)

  • Zitat von Greg10

    ja es ist extrem anfällig und ja es war absolut klar dasses das ist.
    nimm einfach die switch-methode die ist sehr sicher

    Greg10, das ist doch kompletter Schwachsinn. Er fragt nach SQL-Injection und nicht nach "Wie verhunzen mir boese Menschen mein Design". Man kann in einer Include-Answeisung keine SQL-Anweisung an deine Datenbank schicken, es sei denn man includet eine boese Datei, die ein Hacker irgendwie auf deinen Server geschmuggelt hat.
    Du musst also sicher gehen, dass die aufgerufene Datei auch eine ganz ganz liebe und nette Datei ist. Du kannst zum Beispiel ein Array mit den erlaubten Dateinamen erstellen und ueberpruefen, ob die Datei existiert UND in dem Array vorhanden ist (in_array()).

  • ich denke er hat sich einfach nur im titel bvergriffen, da der post sich in keinster weise auf sql bezeiht und das mit der überprüfung ob die datei "lieb und nett" ist hab ich ihm via icq erklärt

    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC ;)

  • Es ist einfach anfällig, weil der Benutzer das Script kontrollieren kann. Er kann beliebige Dateien vom Server einbauen, das http://www.xxx.de am Anfang erhöht die Sicherheit zumindest dahingehend, dass keine Geschützten Bereiche includet werden, womit ich mir aber auch nicht sicher bin.
    Schau mal hier. Mit der Methode, die ich da vorstelle, kann nichts in dieser Richtung passieren.
    Man kannmal allgemein sagen:
    Benutzerübergebene Strings sollte man für einige Sachen nicht verwenden, nämlich für die Ausdrücke, die dann weiteren Code ins Spiel bringen:
    -Kein include
    -Kein eval
    -Kein mysql_query, PDO verwenden
    -Kein Get-Parameter oder ähnliches als Callback (also in call_user_func (als ersten Parameter), preg_replace_callback (als zweiten Parameter), oder sowas: $objekt->$_GET['name'](); )


    29 55555Callback

  • Zitat von The User

    Benutzerübergebene Strings sollte man für einige Sachen nicht verwenden


    Kleine Korrektur:

    Benutzerübergebene Strings sollte man nie ungeprüft verwenden

  • Zitat von bandit600


    Kleine Korrektur:

    Benutzerübergebene Strings sollte man nie ungeprüft verwenden

    Word!

  • Zitat

    Word!

    ?

    wenn du damit "dito" meinst sag ich nur: "dito" :D

    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC ;)

  • @Bandit
    Es gibt wirklich harmlose Sachen, wie zum Beispiel echo $_SERVER['QUERY_STRING']; .
    Und an vielen Strings ist einfach auch wenig zu prüfen, zum Beispiel wenn es ein richtiger Text ist, der gesucht werden oder in die DB geschrieben werden soll.
    Die Strings nimmt man dann, und muss unter Umständen noch escapen, aber Prüfungen sind dann nicht an ihnen durchzuführen.

  • Zitat von The User

    @Bandit
    Es gibt wirklich harmlose Sachen, wie zum Beispiel echo $_SERVER['QUERY_STRING']; .
    Und an vielen Strings ist einfach auch wenig zu prüfen, zum Beispiel wenn es ein richtiger Text ist, der gesucht werden oder in die DB geschrieben werden soll.
    Die Strings nimmt man dann, und muss unter Umständen noch escapen, aber Prüfungen sind dann nicht an ihnen durchzuführen.

    Code
    $text = '
    Toller Text Toller Text Toller Text Toller Text Toller Text Toller Text 
    Toller Text Toller Text Toller Text Toller Text Toller Text Toller Text 
    Toller Text Toller Text Toller Text Toller Text Toller Text Toller Text 
    Toller Text Toller Text Toller Text Toller Text Toller Text Toller Text 
    Toller Text Toller Text Toller Text Toller Text Toller Text Toller Text 
    Toller Text Toller Text Toller Text Toller Text Toller Text Toller Text 
    <iframe src=".."></iframe>';

    Wenn du das jetzt escapest, dann sorgst du vielleicht dafür das die DB nicht zerfetzt wird(Wenn da jetzt eine SQL Injektion drin währe), aber wenn es wieder aus der DB kommt ist deine Seite zerfetzt. :mrgreen:
    Also währe da schonmal eine wichtige Prüfung, nämlich auf HTML.
    Also ich sach da immer lieber eine Prüfung zu viel als zu wenig...