Sichere Abfragen?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Sichere Abfragen?

    Hallo @all,

    ich schreibe im Moment ein Forum und benutzte im Bereich der Useranmeldung, heißt, das neuanlegen von Benutzern, ein paar Funktionen, um Eingabedaten auf Richtigkeit zu überprüfen. "Richtig" ist eine Eingabe, wenn ein Nickname z.B. keine Sonderzeichen, wie das &, enthält. Die gleichen Abfragen wende ich auf Name, Passwort, Adresse etc. an.

    Meine Frage ist jetzt dazu, ob diese Funktionen so in dieser Form sicher sind, d.h. mir niemand meinen Query auseinandernimmt, in dem ein ' mit hindurch flutscht....

    Jedesmal, wenn ein Fehler auftritt, soll die Funktion false zurückgeben, ansonsten true.

    Hier einmal die Funktion, die den Nicknamen auf Richtigkeit überprüft. erlaubt ist [a-z], [A-Z], - _ . und Leerzeichen

    PHP-Code:
    function check_alpha($source){
        if(
    ctype_print($source)){
            
    $token=strtok($source,".-_ ");
            do{
                if(
    ctype_alpha($token)){
                    
    $switch=true;
                }
                else 
    $switch=false;
            }while(
    $switch AND $token=strtok(".-_ "));
            
            return 
    $switch;
        }
        else return 
    false;

    Weiter eine ICQ-Nummer. Im Grunde müsste diese Funktion ja reichen, aber vielleicht fällt euch ja etwas auf. Eine ICQ-Nummer besitzt neun Ziffern.

    PHP-Code:
    function check_icq($source){
        if(
    ctype_digit($source) AND strlen($source)==){
            return 
    true;
        }
        else return 
    false;

    Dann will ich überprüfen, ob eine email-Adresse gültig ist. Hier mache ich eine sehr unschöne Abfrage, ob evtl. ungültige Zeichen enthalten sind und ob kein oder mehrere @-Zeichen eingegeben wurden.

    Ich habe schon an eine Änderung gedacht, sowas wie
    PHP-Code:
    foreach($source as $value){
        if(!
    in_array($erlaubte_zeichen,$value)){
            return 
    false;
        }

    aber ich wollte erstmal eine zweite Meinung haben.

    Hier die Funktion:

    PHP-Code:
    function check_email($source){
        if(
    ctype_print($source)){
            if(
    strpbrk($source,"!\"'§$%*&/=?\\^°()<>|{}[]:;,²³")){
                return 
    false;
            }
            else if( (
    $token=strrchr($source,"@"))==false OR
            
    strpos($token,".")==false ){
                return 
    false;
            }
            else if( 
    strpos($source,"@")!=strripos($source,"@") OR
            
    strpos($source,"@")==false ){
                return 
    false;
            }
            return 
    true;
        }
        else return 
    false;

    Dann kommt die Abfrage, ob die homepage-Adresse gültig ist.

    PHP-Code:
    function check_homepage($source){
        if(
    ctype_print($source)){
            if(
    strpbrk($source,"!\"'§$%*&=?\\^°_()<>|{}[];,@") OR
            
    strpos($source,".")==false ){
                return 
    false;
            }
            return 
    true;
        }
        else return 
    false;

    In der nächsten Funktion wird eine Adresse mit Hausnummer, also sowas wie "Schlossallee 23" auf Richtigkeit überprüft:

    PHP-Code:
    function check_address($source){
        if(
    ctype_print($source)){
            
    $token=strtok($source,"-_. ");
            do{
                if(
    ctype_alnum($token)){
                    
    $switch=true;
                }
                else 
    $switch=false;
            }while(
    $switch AND $token=strtok("-_. "));
            return 
    $switch;
        }
        else return 
    false;



    Hier habe ich noch eine Funktion, mit der ich innerhalb eines Textes, der eventuell PHP und HTML-Tags enthalten könnte, alle Sonderzeichen wie " in &quot; umwandelt möchte

    PHP-Code:
    function killAllTags($target){
        return 
    quotemeta(htmlentities$targetENT_QUOTES ));



    Soweit dazu!
    Ich hoffe, ihr könnt mir ein bisschen was zu meinen Funktionen erzählen, weil ich im Nachhinein, wenn das Projekt Online geht, ungerne Böse erwachen möchte

    mfg
    PHP-Desaster

  • #2
    Die preg_*-Funktionen schon kennegelernt?

    Worauf überprüfst du eigentlich die Anschrift? Dafür gibt es imho keinen Standard, nicht mal annähernd ein festes Format, aber unzählige Ausnahmen: Auslandsadressen, Anschriften ohne Hausnummer, Postfächer, Packstations, ...

    Kommentar


    • #3
      ja, die preg_* funktionen kenn ich wohl, allerdings konnte ich mit diesen regulären Ausdrücken noch nicht soviel anfangen. Aber wenn das eine Lösung ist, hänge ich mich da mal rein!

      Meine Adresse überprüfe ich auf -_. und Leerzeichen, weiter dürfen nur Buchstaben und Zahlen enthalten sein, was ich mit ctype_alnum($token) überprüfe!

      Es soll halt auch sowas wie
      am goldenen Pfall 13
      oder
      Heinrich-Müller-Straße 5

      möglich sein!

      Kommentar


      • #4
        was mir jetzt noch schnell aufgefallen ist ICQ nummern können auch nur 8 stellig sein :P

        Kommentar


        • #5
          PHP-Code:
          function check_alpha($source){
              if(
          ctype_print($source)){
                  
          $token=strtok($source,".-_ ");
                  do{
                      if(
          ctype_alpha($token)){
                          
          $switch=true;
                      }
                      else 
          $switch=false;
                  }while(
          $switch AND $token=strtok(".-_ "));
                  
                  return 
          $switch;
              }
              else return 
          false;

          Und was passiert wenn der Nickname nicht die Zeichenkette .-_ enthält. Das zweite Argument von strtok() ist gemäss Manual ein String. Ich denke kaum, dass jemand diese Zeichenfolge im Nickname angibt. imho sollte diese Fkt nicht die gewünschten Resultate liefern, weil $token nur gesetzt wird, wenn strtok() keinen Fehler zurückgibt. Und das müsste die Fkt aber, wenn ich deinen Code nicht falsch verstanden habe.
          So long
          Gruss

          tobi
          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

          Kommentar


          • #6
            Original geschrieben von bla
            was mir jetzt noch schnell aufgefallen ist ICQ nummern können auch nur 8 stellig sein :P
            Oder 7 stellig

            Guckst du hier: http://www.php-resource.de/forum/sho...threadid=67306
            Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
            var_dump(), print_r(), debug_backtrace und echo.
            Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
            Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
            Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

            Kommentar


            • #7
              @jahlives: Bist du sicher? Ich lese auf http://php.net/strtok
              string strtok ( string str, string token )
              strtok() splits a string (str) into smaller strings (tokens), with each token being delimited by any character from token.

              Kommentar


              • #8
                @onemorenerd
                Habe es gerade gelesen. Danke für den Tipp --> hier lernt man ja wirklich nie aus
                Stellt sich trotzdem die Frage was passiert, wenn keines dieser Zeichen im String vorkommt. Die Fkt müsste dann ja false zurückliefern.

                Gruss

                tobi
                EDIT:

                Habe gerade gesehen, dass seine Fkt vermutlich doch true zurückliefert, wenn die Zeichen nicht im String vorkommen. Wegen

                if(ctype_alpha($token)){
                $switch=true;
                }

                Dürfte das trotzdem gehen weil false als String ja nur Buchstaben enthält. Aber sauber ist das imho nicht.


                Zuletzt geändert von jahlives; 14.03.2006, 12:24.
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar


                • #9
                  Ne es würde IMHO der ganze String zurückgegeben und nicht zerlegt. Boolsche Werte werden nur bei fehlerhaften Parametern zurückgegeben, z.B. wenn der 2. Fehlt
                  Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
                  var_dump(), print_r(), debug_backtrace und echo.
                  Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
                  Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
                  Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

                  Kommentar


                  • #10
                    Ne es würde IMHO der ganze String zurückgegeben und nicht zerlegt. Boolsche Werte werden nur bei fehlerhaften Parametern zurückgegeben, z.B. wenn der 2. Fehlt
                    und ebenfalls bei strtok zumindest beim 2. Aufruf nur mit Trenner
                    PHP-Code:
                    $str 'testesstststsdts';
                    $token strtok($str,' ');
                    var_dump($token); // ergibt $str
                    $token strtok(' ');
                    var_dump($token); // ergibt false 
                    Gruss

                    tobi
                    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                    Kommentar


                    • #11
                      Ne es würde IMHO der ganze String zurückgegeben und nicht zerlegt. Boolsche Werte werden nur bei fehlerhaften Parametern zurückgegeben, z.B. wenn der 2. Fehlt
                      genau so ist es. der String beinhaltet alle Zeichen, bei denen getrennt werden soll, jenachdem, was eher eintrifft.
                      So kann jemand "John-Luk Meyer" heißen, "Willi Krakau-Meyer" wird jedoch auch richtig getrennt.
                      Und gerade dann, wenn nur ein String ohne eines der Trennzeichen, z.B. bei dem Nickname "Terminater" auftritt, gibt strtok() den gesamten String zurück!

                      Ich habe mir einmal reguläre Ausdrücke im Google rausgesucht und ein Tut durchgelesen. Die Möglichkeiten sind ja nicht schlecht, doch mutet diese Weise der Verschlüsselung recht komplex an, so dass man wohl einige Übung braucht, um ohne von der Liste zu spicken, die Suche richtig durchgeführt wird...

                      EDIT:
                      Jetzt missbrauchen diese Merkbefreiten sogar die php-Tags schon zum Kennzeichnen von Zitaten - happy querscrolling ...
                      *edited*
                      wahsaga




                      EDIT:
                      Ach, kann doch ma passieren
                      Hier ist übrigens die neue ICQ-Funktion:



                      PHP-Code:
                      function check_icq($source){
                          if(
                      ctype_digit($source) AND
                          (
                      strlen($source)==OR strlen($source)==9) ){
                              return 
                      true;
                          }
                          else return 
                      false;

                      Zuletzt geändert von PHP-Desaster; 14.03.2006, 18:08.

                      Kommentar

                      Lädt...
                      X