SQL-Injektionen

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

  • SQL-Injektionen

    Hi Leute, mal was anderes; ich habe von SQL-Injektionen gelesen und benutze folgende Abfragen bei übergabe der Variable per URL:

    sql="SELECT * FROM $sitetable WHERE id='$id'";

    Bin ich gegen Injektionen sicher?

  • #2
    Hi,

    nein bist du nicht.

    Siehe hierzu: http://www.unixwiz.net/techtips/sql-injection.html

    Kommentar


    • #3
      Ok! Das ist schon mal geil! Ich habe mal eine Testtabelle angelegt um zu probieren diese zu löschen, wie würde die URL aussehen?

      Kommentar


      • #4
        Les bitte die URL...

        das steht da irgendwo. So nach dem Motto:
        PHP-Code:
          '; DELETE FROM users; 
        oder so....

        Kommentar


        • #5
          Jo les gerade, sehr interessant!

          Kommentar


          • #6
            Also das mit dem mailen ist ja geil! Aber was ich nicht verstehe, wie sicher ich das nun am besten und einfachsten () setzen?

            Kommentar


            • #7
              indem man seit sql-statement vorher prepared - oder alle Variablen die in einer query übernommen werden überprüft. Les weiter

              Kommentar


              • #8
                da steht leider nur die preparierung mit perl auf integer prüfen geht ja fix gibt es nicht eine funktion die überp^rüft ob sql code drin ist?

                Kommentar


                • #9
                  meines wissens nach nicht.
                  Da lass ich mich aber gerne korrigieren.

                  Wenn du eine Datenbankabstraktionsklasse, wie z.B. adoDB, verwendest, hast du da eine Funktion dafür.

                  Ansonsten köntest du zum Beispiel mit substr_count prüfen ob bestimmte Zeichen drin vorkommen.

                  Komfortabel geht das dann zum Beispiel so:
                  PHP-Code:
                  $query "SELECT * FROM tab1";

                  $invalide_werte = array("'"";""="); //usw...

                  if(!in_array($_POST['wert'], $invalide_werte)){
                    
                  mysql_query($query);
                  }else{
                    echo 
                  "Keine validen Daten.";

                  oder so - is nur ne idee...

                  Kommentar


                  • #10
                    prüf doch mit'nem preg_match_all() ob mehr als ein SQL Command in der Query enthalten ist.

                    wenn's mehr als 1 zurückgibt, ist auch mehr als ein command drin.

                    oder mit'm preg_replace() alles rausschmeissen, was nach einem command folgt, das nicht am anfang der Query steht.

                    etwa so:

                    PHP-Code:

                    $pattern 
                    "#(insert|update|delete|create|drop|flush)#im";
                    $matches = array();

                    if(
                    preg_match_all($pattern$sql,$matches) > 1){
                     die(
                    "bäh!");

                    <- nur ne idee... net getestet.

                    Kommentar


                    • #11
                      Für deinen Fall reicht es, die Eingabe in einen intege rzu konvertieren.

                      Für andere Fälle hat PHP mysql_real_escape_string erfunden.

                      Ob mehr als eine SQL-Anweisung vorhandne ist, kannst du mit PHP alleine nicht feststellen, da musst du selbst tätig werden, der Code von ankh reicht da nicht aus
                      Code:
                      DELETE FROM 
                      FROM beitraege
                      WHERE beitrag_text LIKE '%update%'
                      Soll alle Beiträge löschen, bei denen im Text das Wort update vorkommt, würde aber nach ankhs Code nicht ausgeführt werden, da es delete und update enthält
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        das ist korrekt.

                        war auch nur'n kleiner geistesblitz...

                        mysql_real_escape() ist in der Tat die sinnvollere Lösung.

                        Kommentar


                        • #13
                          Sehr interessant die ganzen Ideen, wie funktioniert denn diese PHP-Funktion? Wäre ja schon schade, wenn in Gästebuch-Texten oder im Forum select gelöscht wird...integer geht auf jeden fall bei vielen abfragen auf meiner seite aber manchmal halt wie im Gästebuch nicht...Danke an alle...mal in die Funktionsrefernz kicken...

                          Kommentar


                          • #14
                            Ok, das habe ich gefunden:

                            Beispiel
                            <?PHP
                            $var = "Ein 'kleiner' Satz!";
                            echo mysql_escape_string($var);
                            ?>

                            Ausgabe
                            Ein \'kleiner\' Satz!

                            Das macht die Funktion?

                            Weil ich ja sowieso fast alle übergebenen Variabel mit addslashes bearbeite? Ist das das gleiche?

                            Kommentar


                            • #15
                              fast das gleiche, jo

                              die mysql_escape() funktionen lassen allerdings % und _ in ruhe.

                              mysql_real_escape() nutzt dann noch die Verbindungskennung um entsprechende der Zeichenkodierung escapen zu können.

                              Kommentar

                              Lädt...
                              X