Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Injections

Einklappen

Neue Werbung 2019

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

  • SQL Injections

    Hallo

    Ich programmiere gerade an einer Homepage, die u.A. auch Daten aus einer Datenbank liest bzw. auch gelegentlich Daten in die DB schreibt. Ich verwende dazu die Funktion mysql_query. Auf der DB habe ich einen Benutzer angelegt, der nur Rechte für die Datenbank hat, auf der meine Daten liegen (auf meinem Webaccount kann ich leider keine Benutzer selbst anlegen, d.h. ich habe einen Benutzer auf der DB, der alle Rechte auf die ihm zur Verfügung stehenden Datenbank hat; Ich würde sonst einen Benutzer anlegen, der nur Leserechte hat und dann einen Benutzer, der nur Schreibrechte hat und den geringen Teil im Quellcode, der auf die DB schreibt, besonders absichern).

    Ich habe nun von den Sicherheitsproblemen gehört, die auftreten, wenn man von Script zu Script Benutzereingaben überträgt (ich muss gew. Daten übertragen). Zwar kann ein potentieller Hacker keine Benutzerberechtigungen in der DB verändern und sich somit Zugang zum DB-Server verschaffen (ich arbeite wie oben erwähnt mit einem normalen Benutzer), er kann aber meine Daten in der DB doch einigermaßen verändern, was mich ebenfalls stören würde. Ich habe nun probiert, an einen per GET übertragenen Wert mittels "; INSERT INTO usw" ein zweites Statement anzuhängen, was nicht funktionierte (es lieferte auch keine Fehlermeldung). Kann man mit der Funktion "mysql_query" immer nur ein SQL Statement ausführen? Ich habe mir auch gedacht, dass ich jeden übergebenen Parameter (auch Integer und Date Werte) in Hochkomma setze (im WHERE Zweig), denn dann werden die veränderten Befehle wenigstens nur als Inhalte interpretiert und ein Hackversuch endet in einem SQL Fehler. Sind diese Maßnahmen ausreichend oder fällt jemandem noch ein Sicherheitsloch auf?

    Wie verhindert ihr in euren Scripten SQL Injections?


  • #2
    Das was du suchst?
    Nicht jeder Fehler ist ein Bug.

    Kommentar


    • #3
      Die wohl wichtigste Maßnahme ist die Verwendung von mysql_escape_string oder die explizite Typ-Umwandlung von int Werten.
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Ich habe schon an eine Überprüfung jedes Übergabeparameters gedacht, nur ist das ziemlich mühsam zumale ich sehr viele Übergabeparameter habe. In erster Linie ist mir wichtig, dass kein Hackversuch gelingt (dass meine Daten immer im Konsistenten Zustand bleiben und dass keine Daten gelöscht/hinzugefügt werden). Ob nun beim Hackversuch die Parameter richtiggestellt werden, ist mir eigentl. egal.

        Ich danke für die Funktion. Laut PHP Hilfe sind damit keine Injections mehr möglich. Die Umwandlung von Int- Werten werde ich auch machen.

        Kommentar


        • #5
          Bleibt zu sagen: Für Sicherheitsaspekte sollte die Frage nach dem Aufwand immer weit hinten stehen.

          Mit Verlaub verschoben ins Beginner Forum.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            ich lass bevor ich DB Eintr#ge mache immer über meine Werte eine Funktion laufen:

            PHP-Code:
            <?php
              
            // SQL PROTECTION
              //
              
            function sql_protect($value,$str=0) {
                  
            // Überflüssige Maskierungen aus der übergebenen Variablen entfernen
                  
            if(get_magic_quotes_gpc()) {
                      
            $value stripslashes($value);
                  }
                  
            // Übergebene Variablenwert in Anführungszeichen setzen, sofern keine
                  // Zahl oder ein numerischer String vorliegt
                  
            if(!is_numeric($value) AND $str != 1) {
                      
            $value "'"mysql_real_escape_string($value) ."'";
                  }
                  return 
            $value;
              }
            ?>
            und dann:

            PHP-Code:
            <?php
                    $sql 
            "UPDATE points_types
                            SET    name = "
            sql_protect($name) ."
                            WHERE  `ps-tid` = "
            sql_protect($id);
            ?>
            vielleicht hilft das weiter

            Grüße
            Da Psy
            "Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)

            Kommentar


            • #7
              Wofür ist der $str-Flag?

              Kommentar


              • #8
                Zitat von Zergling
                Wofür ist der $str-Flag?
                gute Frage, nächste Frage

                ne, ich glaube den kann man entfernen. Hatte dort glaub mal was versucht, aber an sich ist der unnötig.

                Bei 1 soll er einfach keine einfachen Anführungszeichen und die mysql_real_escape_string function auf die $value ausführen. Is aber schwachsinnig, da würde die Funktion ihre Funktion verlieren und somit hat man wieder ein Sicherheitsrisiko mehr

                Also raus damit!

                EDIT:

                Wobei, wenn man eine Zahl hat, welche in die DB als String soll, ist der flag vielleicht doch nicht so verkehrt, nur ein wenig anders:

                PHP-Code:
                <?php
                  
                // SQL PROTECTION
                  //
                  
                function sql_protect($value,$str=0) {
                      
                // Überflüssige Maskierungen aus der übergebenen Variablen entfernen
                      
                if(get_magic_quotes_gpc()) {
                          
                $value stripslashes($value);
                      }
                      
                // Übergebene Variablenwert in Anführungszeichen setzen, sofern keine
                      // Zahl oder ein numerischer String vorliegt
                      
                if($str==OR !is_numeric($value)) {
                          
                $value "'"mysql_real_escape_string($value) ."'";
                      }
                      return 
                $value;
                  }
                ?>
                und dann:

                PHP-Code:
                <?php
                        $sql 
                "UPDATE points_types
                                SET    name = "
                sql_protect($name) ."
                                WHERE  `ps-tid` = "
                sql_protect($id);
                ?>
                Grüße
                Da Psy
                "Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)

                Kommentar


                • #9
                  Also ich kann immer nur wieder auf den Thread verweisen

                  Kommentar


                  • #10
                    Zitat von M3g4Star
                    Also ich kann immer nur wieder auf den Thread verweisen
                    Warum eigentlich?
                    Grade der SQL-Injection-Abschnitt ist doch schon veraltet!
                    Es ist nicht mehr möglich 2 Queries über einen mysql_query() Aufruf abzusetzen und mysql_real_escape_string() vermißt man gänzlich auf der Seite ^^

                    Kommentar


                    • #11
                      Zitat von Zergling
                      Zitat von M3g4Star
                      Also ich kann immer nur wieder auf den Thread verweisen
                      Warum eigentlich?
                      Grade der SQL-Injection-Abschnitt ist doch schon veraltet!
                      Es ist nicht mehr möglich 2 Queries über einen mysql_query() Aufruf abzusetzen und mysql_real_escape_string() vermißt man gänzlich auf der Seite ^^
                      • - Yes I know my enemies -
                        Rage Against The Machine

                      Ich finds gut das Prinzip zu kennen, statt einfach nur mysql_real_escape_string () zu predigen. Und bei mysqli_multi_query () steht das Problem doch wieder vor der Tür, oder?
                      .
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        Es ist schön das Prinzip zu kennen, aber es ist nunmal veraltet und wie man effektiv dagegen vorgeht wird in dem Artikel auch nicht beschrieben. Stattdessen wieder das alte Gedöhns mit addslashes(). Gerade deshalb wird magic_quotes abgeschafft, weil es eine trügerische Sicherheit ist. Das muss gesagt sein.

                        Kommentar


                        • #13
                          Ich bezog mich auch mehr auf die Aussage mit den Mehrfachqueries. Immer mehr drängt sich mir der Gedanke auf, dass es Zeit hierfür wird:
                          http://www.phpfriend.de/forum/ftopic61640.html
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar

                          Lädt...
                          X