der hans: sicherheitsfrage??? eines Anfängers

Hallo@all,

glech noch ne dumme Frage eines Anfängers hinterher ^^

Also es gibt ja sowas wie mysql_injection, die man mit mysql_real_escape_string() weitestgehendst unterdrücken kann.

Was ist jetzt aber, wenn ich benutzereingaben direkt mit einem Vorgegebenen Wert vergleiche, ist dort auch eine "Injection" möglich (auch wenn es ja keine Injection ist aber halt irgenwie ne Hackung)

bsp:

if ($benutzereingabe=="hallo") {
  irgendwas;
  }

wenn jetzt benutzereingabe folgendes ist?
1==1||blabla
oder
"a"=="a"||blabla

???

Wenn ja, wie ist dies zu unterdrücken, was muss ich vorher auf die benutzereingabe anwenden???

dankeschön
und wieder a grüßele aus franken

  1. Hallo!

    Was ist jetzt aber, wenn ich benutzereingaben direkt mit einem Vorgegebenen Wert vergleiche, ist dort auch eine "Injection" möglich (auch wenn es ja keine Injection ist aber halt irgenwie ne Hackung)

    bsp:

    if ($benutzereingabe=="hallo") {
      irgendwas;
      }

    Das wird als String behandelt und nicht ausgeführt. Da brauchst du dir keine Sorgen machen. Gefährlich wirds nur dann, wenn du eine Benutzereingabe mit eval() ausführen läßt. Da kann man dir wiederum Code einschleusen.

    mfg
      frafu

  2. Hallo,

    Wenn du sicherstellst, dass nur der String "guter String" in die DB geschrieben wird, hast nie Probleme:

      
    if($eingabe == 'guter String'){  
        mysql_query($eingabe); // ==  mysql_query( 'guter String');  
    }  
    
    

    Gruß,
    Severin

    --
    They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
    -- Benjamin Franklin
    1. Hallo!

      if($eingabe == 'guter String'){
          mysql_query($eingabe); // ==  mysql_query( 'guter String');
      }

        
      Was soll dieser Hinweis bringen?  
      Wenn jetzt jemand Vor- und Nachname in eine DB eintragen können soll, dann müsste ich nach dieser Logik alle möglichen Vor- und Nachnamen die vorkommen könnten wissen um sie abzufragen.  
      Es gibt die Funkton mysql\_real\_escape\_string() die den String escaped. Vergleichen brauch ich da nichts.  
        
      mfg  
        frafu
      
      1. Hallo,

        Wenn jetzt jemand Vor- und Nachname in eine DB eintragen können soll, dann müsste ich nach dieser Logik alle möglichen Vor- und Nachnamen die vorkommen könnten wissen um sie abzufragen.

        Es geht auch nicht um beliebige Benutzereingaben. Es geht um Fälle, in denen es eine eine definierte Anzahl gültiger Strings gibt.
        Beispiel:
        Du schreibt eine Online Umfrage und via HTML-Formular und Radiobutton können genau die Werte "sehr gut","gut","ausreichend","schlecht" und "miserabel" hereinkommen.

        Jetzt macht es Sinn zu prüfen, ob der Benutzer einen dieser Werte übermittelt hat. Wenn dies der Fall ist weiß man, dass die Eingaben ungefährlich sind und auch, dass eine gültige (oder überhaupt eine) Auswahl getroffen wurde.

        In diesem Fall wäre es sinnlos mit isset, empty und mysql_real_escape_string herumzuspielen.

        Gruß,
        Severin

        --
        They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
        -- Benjamin Franklin
        1. hi,

          Du schreibt eine Online Umfrage und via HTML-Formular und Radiobutton können genau die Werte "sehr gut","gut","ausreichend","schlecht" und "miserabel" hereinkommen.

          Jetzt macht es Sinn zu prüfen, ob der Benutzer einen dieser Werte übermittelt hat.

          Vielleicht "macht" es in so einem Falle noch mehr Sinn, gar nicht die Texte zu übertragen, sondern nummerische Werte von 1 bis 5 - das prüft sich noch leichter.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hallo,

            Vielleicht "macht" es in so einem Falle noch mehr Sinn, gar nicht die Texte zu übertragen, sondern nummerische Werte von 1 bis 5 - das prüft sich noch leichter.

            Was hätte ich gewonnen? Gut in diesem Fall kann man Schulnoten als Vergleich sehen, aber in der Regel sind mir "klare" Werte lieber als irgendwelche kryptischen Ziffern- und/oder Buchstabenkombinationen.

            Gruß,
            Severin

            --
            They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
            -- Benjamin Franklin
  3. hi,

    if ($benutzereingabe=="hallo") {
      irgendwas;
      }

    wenn jetzt benutzereingabe folgendes ist?
    1==1||blabla
    oder
    "a"=="a"||blabla

    ???

    Das stellt absolut kein Problem dar.

    Der Text liegt bereits in einem String vor - also werden die reinen Textinhalte 1==1||blabla mit hallo oder "a"=="a"||blabla mit hallo verglichen.

    Bei SQL besteht das Problem darin, dass du jemandem einen String in einer bestimmten Syntax übergeben musst, und diese Syntax durch gewisse Zeichen zerstört werden kann.

    Bei deinem Beispiel musst _du_ aber nichts irgendwohin übergeben, die Nutzereingabe (aus GET/POST/...) liegt dir bereits als Stringvariable vor.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  4. Moin!

    glech noch ne dumme Frage eines Anfängers hinterher ^^

    So dumm ist die gar nicht, immerhin ist sie logisch weitergedacht. Du hast allerdings was übersehen.

    if ($benutzereingabe=="hallo") {
      irgendwas;
      }

    wenn jetzt benutzereingabe folgendes ist?
    1==1||blabla

    Alles, was in Variablen steht, sind Daten. Daten sind kein Programmcode, können also auch nicht ausgeführt werden.

    Warum SQL-Injection dann geht? Die Daten, die man da reintut, sind doch auch nur Variablen.

    Stimmt, aber bei SQL hat man zwei Ebenen: Erstens die PHP-Ebene, in der man einen Query-String zusammensetzt. Der ist für PHP noch komplett ungefährlich. Zweitens aber die SQL-Ebene. Der zusammengesetzte String wird _interpretiert_ und _ausgeführt_. Ganz genau so, wie eine Textdatei auf dem Server auch erstmal ungefährlich ist, aber wenn PHP diese Datei einliest und als PHP-Skript interpretiert und ausführt, wird das auch gefährlich.

    Der entscheidende Faktor ist daher immer: Wird das, was ich habe, als Daten betrachtet (das ist ungefährlich), oder als Programmanweisung (das ist gefährlich). Wenn es als Programmanweisung betrachtet wird, muß man Vorkehrungen treffen, dass nur genau die Befehle ausgeführt werden, die man selbst wünscht, und keinerlei anderen.

    Auch in PHP ist das Ausführen von Code, der in Strings steht, möglich (und gefährlich!): http://www.php.net/eval. Würdest du eval() nutzen, um einen String zusammenzusetzen, der deine oben genannte IF-Bedingung enthält, wäre das böse:

    $evalstring = "if ($benutzereingabe=='hallo') {irgendwas();}"  
    echo $evalstring; // ungefährlich  
    //eval ($evalstring); // extrem gefährlich!  
    
    

    Weil der Inhalt von $benutzereingabe in den String integriert wird (mit echo ausgeben lassen), würde auch deine "Zusatzbedingung" als Code in den String geschrieben und ausgeführt.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
  5. Hi@all,

    DANKE FÜR ALL DIE ANTWORTEN!!!

    Also das heißt dann für mich, dass ich nur auf mysql_srings mysql_real_escape_string() anwenden muss.

    Auf Benutzereingaben (GET/POST/COOKIE/...) muss ich eigentlich nix anwenden oder so, nur wenn ich sie mit eval() benutze??

    Was mach ich dann, wenn ich sie mit eval() benutzen möchte???

    DANKE

    grüßchen aus franken

    1. Hallo,

      Was mach ich dann, wenn ich sie mit eval() benutzen möchte???

      Deinen Code umschreiben. Es gibt kaum Gründe eval benutzen zu wollen und wenn man so weit ist dass man es sinnvoll einsetzten kann, weiß man auch wie man dies halbwegs sicher tun kann ;-)

      Gruß,
      Severin

      --
      They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
      -- Benjamin Franklin
    2. echo $begrüßung;

      DANKE FÜR ALL DIE ANTWORTEN!!!

      Kein Grund mit Versalien um sich zu werfen ...

      Also das heißt dann für mich, dass ich nur auf mysql_srings mysql_real_escape_string() anwenden muss.

      Das heißt, dass du das auf Stringwerte anwenden musst, die in einem SQL-Statement zu stehen kommen sollen.

      Auf Benutzereingaben (GET/POST/COOKIE/...) muss ich eigentlich nix anwenden oder so, nur wenn ich sie mit eval() benutze??

      Auf Benutzereingaben müssen diverse Plausibilitätsprüfungen angewendet werden, bevor sie weiter verwendet werden sollen. Eine Email-Adresse enthält keine Zeilenumbruchszeichen. Wenn trotzdem welche drin sind, kann das ein Versuch von Header-Injection sein. usw. usf.

      Außerdem spielt noch ein PHP-Feature namens Magic Quotes eine Rolle. Siehe </archiv/2006/8/t134653/#m873635>

      Bei der Ausgabe von Daten sind diese im Kontext der jeweiligen Ausgabe zu kodieren. Daten in MySQL-Statements mit mysql_real_escape_string(), Daten in einer URL mit urlencode(), Daten für HTML mit htmlspecialchars(), etc. pp.

      echo "$verabschiedung $name";

      1. Hi,
        danke!!

        Danke für den hinweis, also heißt das, dass ich wenn ich HTML-Text in eine Datenbank lade ich bei der Ausgabe htmlspecialchars anwenden sollte??

        Ok ist bei mir meistens eh so nicht der Fall aber was mach ich wenn auch sonderzeichen wie äöü vorkommen zwischen html-tags z.B.

        erts htmlspecialchars() oder htmlentities() oder wie??
        bin etwas verwirrt...

        auf jedenfall weiß ich jetzt das wegen den benutzereingaben und sql-statements.

        grüßele

        1. hi,

          also heißt das, dass ich wenn ich HTML-Text in eine Datenbank lade ich bei der Ausgabe htmlspecialchars anwenden sollte??

          Selbstverständlich.

          Ok ist bei mir meistens eh so nicht der Fall aber was mach ich wenn auch sonderzeichen wie äöü vorkommen zwischen html-tags z.B.

          erts htmlspecialchars() oder htmlentities() oder wie??

          htmlspecialchars reicht aus.
          htmlentities (_statt_ htmlspecialchars, dessen Funktionalität beinhaltet es ja bereits) wäre höchstens dann sinnvoll, wenn Zeichen vorkommen, die sich in der gewählten Zeichenkodierung nicht abbilden lassen. In dem Fall wäre es aber sicher sinnvoller, eine passendere Zeichenkodierung zu verwenden.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hi,

            also ich denke da grad an meine äöü die in der Datenabnk gespeicher sein können.
            Wenn die nicht in HTML-Code umgewandelt werden (was glaube ich htmlspecialchars() leider nicht macht) wird das ja (zumindest bei meinem DOCTYPE) von w3c beanstandet.

            Oder lese ich das Falsch, da steht irgendwas, dass htmlspecialchars nur <>'&" umwandelt.

            sollte ich dann htmlentiites() nehmen?

            danke nochmal

            grüßchen

            1. hi,

              also ich denke da grad an meine äöü die in der Datenabnk gespeicher sein können.
              Wenn die nicht in HTML-Code umgewandelt werden (was glaube ich htmlspecialchars() leider nicht macht) wird das ja (zumindest bei meinem DOCTYPE) von w3c beanstandet.

              Das hat nichts mit dem Doctype zu tun, sondern mit der schon erwähnten Zeichenkodierung [1].

              Oder lese ich das Falsch, da steht irgendwas, dass htmlspecialchars nur <>'&" umwandelt.

              Ja, reicht ja wie gesagt auch völlig aus.

              sollte ich dann htmlentiites() nehmen?

              Nein.

              [1] Achtung, hier ist nicht nur die Angabe im HTML relevant, sondern zuvor noch die im Content-Type-Header der Serverantwort. Aber zu diesem Thema wurde schon eine ganze Menge geschrieben, da hilft das Archiv oder eine Suche im www gerne weiter.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. Hi,

                OK ich glaub ich hab's...

                gruß

              2. Hab grad gesehen,

                eigentlich muss ich ja bloß des und umwandeln bei iso-8859-1
                <>ß" ' würde ja eigentlich auch ohne umwandlung laut w3c korrekt sein.

                Muss ich dann überhaupt htmlspecialchars()??
                gibt's was nur für &?
                oder ist ein preg_replace für das & besser??

                diese zeichensätze machen mich fertig. ich glaube ich hätt des mal irgendwo lernen sollen...

                grüßchen

                1. hi,

                  eigentlich muss ich ja bloß des und umwandeln bei iso-8859-1
                  <>ß" ' würde ja eigentlich auch ohne umwandlung laut w3c korrekt sein.

                  < und > können aber kritisch sein.

                  Nehmen wir mal an, und willst meine Texteingabe in einem Absatz anzeigen, also
                  <p>$text</p>

                  Wenn ich als Text jetzt
                  So, nach dem hier </p> ist Schluss.
                  eingebe - was kommt dabei wohl heraus?

                  Muss ich dann überhaupt htmlspecialchars()??

                  Ja, du "musst".
                  Wenn du Benutzereingaben (oder allgemein von außen kommende Werte) irgendwo im HTML-Kontext ausgibst, nutze _immer_ (mindestens) htmlspecialchars - sonst reißt du dir im Nu potentielle Cross Site Scripting-Lücken auf.

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }