manuelle Eingaben unterbinden

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

  • manuelle Eingaben unterbinden

    Hallo zusammen ...

    ich würde gern folgendes script

    $result = mysql_query("SELECT * FROM table WHERE id=$id");
    $row = mysql_fetch_array($result);
    echo "".$row['data']."";

    erweitern, so daß wenn jemand manuel im Adressleistenbereich was zufälliges id ID-Sektion eingibt, zB ?id=ABG123 oder ?id=-,123 ,, usw ,, sodann eine leere Seite zu sehen bekommt. Damit möchte ich unschöne Fehlermeldungen vermeiden und vorallem manuele Eingaben soweit wie möglich unterbinden.

  • #2
    also erstmal deutet Deine Beschreibung auf ein ganz anderes Problem hin, denn Deine Abfrage ist scheinbar schön offen für sql injection und dann noch register_globals = on???
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      erweitern, so daß wenn jemand manuel im Adressleistenbereich was zufälliges id ID-Sektion eingibt, zB ?id=ABG123 oder ?id=-,123 ,, usw ,, sodann eine leere Seite zu sehen bekommt.
      Also wenn die id existiert, dann kannst du nicht erkennen, dass sie manuell gesetzt wurde. Eine nicht-existierende id kriegst du raus indem du die Tabelle nach dieser id abfragst (MelloPies Sitchwort aber beachten!!) und wenn kein Treffer dann gibst du eine leere Seite aus.
      PHP-Code:
      //zum Prüfen ob eine GET Var ein Integer ist
      if ((string)$_GET['id'] == (string)intval($_GET['id'])) {
        echo 
      'Dies ist ein Integer';
      } else {
        echo 
      'halt keiner';

      Gruss

      tobi
      Zuletzt geändert von jahlives; 28.08.2008, 11:03.
      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


      • #4
        @Mellopie werde nur noch mit $_GET & $_REQUEST arbeiten - schon allein weil ab php6 register_globals = on nicht mehr möglich sein soll.

        @jahlives thx, war das was ich suchte ...

        p.s ist es eig möglich den Teil ?id=XY im URL garnicht anzuzeigen? wäre Mir ehrlich gesagt wohler ...

        Kommentar


        • #5
          p.s ist es eig möglich den Teil ?id=XY im URL garnicht anzuzeigen? wäre Mir ehrlich gesagt wohler ...
          Irgendwo in der URL muss der Wert stehen, sonst weisst du ja nicht welche Seite geladen werden soll. Die Werte einfach gut prüfen und auch auf SQL-Injections achten, dann kann eigentlich nicht viel passieren
          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
            p.s ist es eig möglich den Teil ?id=XY im URL garnicht anzuzeigen? wäre Mir ehrlich gesagt wohler ...
            Gedankenübertragung von Mensch zu Server... Wobei, der Mensch soll die ID ja auch nicht kennen. Bring deinem Server das Raten bei...

            OffTopic:
            Statt leere Seite würde man korrekter Weise übrigens einen 404er senden.

            Kommentar


            • #7
              Original geschrieben von jahlives
              //zum Prüfen ob eine GET Var ein Integer ist
              PHP-Code:
              if ((string)$_GET['id'] == (string)intval($_GET['id'])) {
                echo 
              'Dies ist ein Integer';
              } else {
                echo 
              'halt keiner';

              Gruss

              tobi

              kann mir jemand sagen wie man diesen codeschnippsel erweitert, so daß gleichzeitig geprüft wird, ob die 'id' in der db vorhanden ist?
              mfg, Jan

              Kommentar


              • #8
                Ähm SELECT Query an die Datenbank schicken und mit mysql_num_rows kontrollieren, ob ein Datensatz zurück kommt.

                Kommentar


                • #9
                  Original geschrieben von TobiaZ
                  Ähm SELECT Query an die Datenbank schicken und mit mysql_num_rows kontrollieren, ob ein Datensatz zurück kommt.
                  ja, weiß ich ... if (mysql_num_rows($field)==1) { }else{header( 'Location: ../home.php' ) ;}
                  aber jetzt habe ich 2 if Abfragen untereinander die beide nach 'else' identisch sind. Vielleicht könnte man diese irgendwie in eine verschachteln ?

                  Kommentar


                  • #10
                    if(Bedingung A && Bedingung B)

                    GRUNDLAGEN!!!

                    Kommentar


                    • #11
                      Zunächst einmal sollte dir klar sein, egal ob $_GET['id'] ein String oder int wert ist der nicht in der DB ist wirst du immer 0 rows bei mysql_num_rows() erhalten...

                      Gesetzten Fall du unterbindest deine SQL Injection Anfälligkeit


                      Abgesehen davon, wenn du dir das PHP Manual anschaust wirst du unweigerlich auf
                      function.is-int

                      stossen die exakt das macht was du willst....

                      bzgl. Verschachtelung, denk doch mal logisch nach....

                      Stell dir mal die Fragen:
                      - Muss ich wenn $_GET['id'] kein int ist überhaupt die DB belästigen?
                      Nö, vollkommen unnötig
                      - Wenn ich ein integer wert habe was dann? ich frage die DB ob es die ID überhaupt gibt
                      - Wenn kein int oder id nicht existiert -> error

                      Das ergibt folgendes...

                      PHP-Code:
                      if( is_int() )
                      {
                        
                      mysql_real_escape(); 

                       if(
                      mysql_num_rows() != 1)
                         
                        
                      }
                      else
                       die(
                      "kein string"); 
                      Die Lücken darfst du selbst ausfüllen, zumindest sollte jetzt ein Gefühl dafür da sein

                      //edit
                      Original geschrieben von TobiaZ
                      if(Bedingung A && Bedingung B)

                      GRUNDLAGEN!!!
                      Wie willst Bedingung B denn machen? Zu dem Zeitpunkt muss du bereits wissen was dir mysql_num_rows(); zurück geliefert. Wodurch auch die DB mit einem möglichen String unnötig abgefragt wurde....

                      die einzige Möglichkeit ist wohl spontan nur:
                      if(is_int() && checkID_AT_DB() )
                      echo "klatsch in die hände und lass uns fröhlich sein xD";

                      //edit 2:
                      vote 4 move to php gedöns
                      Zuletzt geändert von Payne_of_Death; 16.09.2008, 18:11.
                      [color=blue]MfG Payne_of_Death[/color]

                      [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                      [color=red]Merke:[/color]
                      [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                      Murphy`s Importanst LAWS
                      Jede Lösung bringt nur neue Probleme
                      Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                      In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                      Kommentar


                      • #12
                        OffTopic:
                        Jo, hatte nur die Frage gelesen - und das auch nur unvollständig...

                        Kommentar


                        • #13
                          Original geschrieben von Vestron
                          p.s ist es eig möglich den Teil ?id=XY im URL garnicht anzuzeigen? wäre Mir ehrlich gesagt wohler ...
                          Ja, in dem du Formulare mit "POST" und hidden Input verwendest. Manipulieren kann man es aber trotzdem.
                          mfg
                          marc75

                          <Platz für anderes>

                          Kommentar


                          • #14
                            @Foltermeister
                            is_int() bringt ned viel. Da is_int() keinen Type Cast macht und nur true zurückgibt, wenn es wirklich ein Integer ist. POST/GET-Werte sind aber immer Strings!
                            Hinweis: Um zu testen, ob eine Variable eine Zahl oder eine numerische Zeichenkette ist (wie zum Beispiel Formularangaben, die immer Zeichenketten sind), müssen Sie is_numeric() verwenden.
                            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

                            Lädt...
                            X