Ankündigung

Einklappen
Keine Ankündigung bisher.

is_numeric gegen myqs injection ausreichen?

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

  • is_numeric gegen myqs injection ausreichen?

    Früher wurde einfach geschrieben
    select *from DB WHERE id=$_GET["id"]
    jetzt kann das schlecht enden.

    Ich teste die id immer über is_numeric
    $id=$_GET["id"]
    if (!is_numeric($id))
    echo "keine Zahl";
    select *from DB WHERE id=$id;
    ist das ausreichen oder lässt man immer noch eine Lücke?

    Bei string verwende ich immer:
    $name= $mysqli->real_escape_string($_POST["name"]);


  • #2
    Eingabevalidierung und Kontextwechsel sind zwei verschiedene Themen. Das eine hat mit dem anderen nichts zu tun.

    Einfacher wäre es, du würdest generell Prepared Statements verwenden.

    Kommentar


    • #3
      Hallo hellbringer,
      vielen Dank , aber
      bin noch etwas überfragt, was meinst mit Kontextwechsel?
      ein Beispiel wäre gut

      Kommentar


      • #4
        Eingabevalidierung ist was der Benutzer eingeben darf.. Dh wenn ein Alter angegeben werden soll, dann hat zB 999 keinen Sinn, genauso wenig wir "Foo". Dh diese Regeln gibst du vor, haben aber (in dem Sinne) kein technisches Gefahrenpotential in der Ebene. Das ist halt einfach dann nur Mist.

        Kontextwechsel hat einen tech. Hintergrund und ist immer zu machen, unabhängig von oben. Da geht es um Syntaxüberschneidungen etc etc.. Und genau da passieren die Code-Injections.
        PHP.de Wissenssammlung | Debugging: Finde DEINE Fehler selbst! | mysql_* ist veraltet! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__ | Kein Support per PN

        Kommentar


        • #5
          Zitat von amiga1200 Beitrag anzeigen
          Hallo hellbringer,
          vielen Dank , aber
          bin noch etwas überfragt, was meinst mit Kontextwechsel?
          ein Beispiel wäre gut
          https://php-de.github.io/jumpto/kontextwechsel/

          Kommentar


          • #6
            PHP-Code:
            $deine_id filter_input(INPUT_GET'id'FILTER_SANITIZE_NUMBER_INT); 
            Würde ich so machen.

            Kommentar


            • #7
              Was spricht gegen mysqli_real_escape_string / mysqli->real_escape_string? Eine Ziffernfolge ist doch letztendlich auch erst mal ein String und in erster Linie geht es doch darum zu erkennen, ob darin irgendein injection code enthalten ist.

              Kommentar


              • #8
                Zitat von hellbringer Beitrag anzeigen
                Eingabevalidierung und Kontextwechsel sind zwei verschiedene Themen. Das eine hat mit dem anderen nichts zu tun.
                PHP.de Wissenssammlung | Debugging: Finde DEINE Fehler selbst! | mysql_* ist veraltet! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__ | Kein Support per PN

                Kommentar


                • #9
                  Ja, gut. Also lautet die klare Antwort auf die ursprüngliche Frage eindeutig "JAIN", da einerseits is_numeric oder ctype_digit durchaus in der Lage sind das Vorhandensein anderer Zeichen mit einem netten FALSE zu kommentieren (der gewünschte Effekt injections zu verhindern wäre damit gegeben), programmiertechnisch korrekter ist jedoch bei dieser Zielsetzung mysqli_real_escape_string.

                  Kommentar


                  • #10
                    Zitat von silen Beitrag anzeigen
                    Ja, gut. Also lautet die klare Antwort auf die ursprüngliche Frage eindeutig "JAIN", da einerseits is_numeric oder ctype_digit durchaus in der Lage sind das Vorhandensein anderer Zeichen mit einem netten FALSE zu kommentieren (der gewünschte Effekt injections zu verhindern wäre damit gegeben), programmiertechnisch korrekter ist jedoch bei dieser Zielsetzung mysqli_real_escape_string.
                    Du vermischst zwei Dinge. Eingabevalidierung hat nichts mit dem Kontextwechsel zu tun. Du musst beides machen. Erstens musst du prüfen, ob die Benutzereingaben plausibel sind. Und zweitens musst du den Kontextwechsel beachten (also escapen oder Prepared Statements verwenden). Das eine ersetzt nicht das andere.

                    Kommentar


                    • #11
                      programmiertechnisch korrekter ist jedoch bei dieser Zielsetzung mysqli_real_escape_string
                      Ne, sondern prepared statements
                      Oder explizites Casten auf Integer, bei Interger-Werten. 'select *from DB WHERE id= '. (int) $id

                      Aber wenn du durchgehend, für solche Szenarien, Prepared Statements nutzt musst du dir weniger Gedanken machen.
                      Relax, you're doing fine.
                      RTFM | php.de Wissenssammlung | Datenbankindizes | Stay fit

                      Kommentar


                      • #12
                        (der gewünschte Effekt injections zu verhindern wäre damit gegeben
                        Aber es ist nicht deren Daseinsberechtigung. Nimm einfach das richtige Tool und gut ist. Diese eigenartigen Diskussionen bringen doch nichts. Du sollst Eingaben ja nicht verstümmeln, sondern nur den Kontextwechsel korrekt behandeln.

                        Was immer du dann noch mit den Daten an Eigabevalidierungen machst ist anderes Thema. Ich wiederhole mich: Ein Kontextwechsel ist immer sauber zu behandeln. Eingabevalidierungen kommen da noch (je nach Anwendungsfall) dazu. Kontextwechsel zB zu SQL hin hingegen sind immer gleich. Idelaerweise Prepared Statments.
                        PHP.de Wissenssammlung | Debugging: Finde DEINE Fehler selbst! | mysql_* ist veraltet! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__ | Kein Support per PN

                        Kommentar


                        • #13
                          Richtig. Ich hab den Teil der Eingabevalidierung unter den Tisch fallen lassen und mich nur auf die injections konzentriert. Asche auf mein Haupt

                          Kommentar


                          • #14
                            Schematisch sieht das so aus

                            Eingabevalidierung
                            Kontextwechsel zu SQL
                            SQL Abfrage
                            Kontextwechsel zu HTML
                            HTML Ausgabe

                            Kommentar

                            Lädt...
                            X