Formularfeld gegen SQL-Injection und Darstellungsveränderungen

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

  • Formularfeld gegen SQL-Injection und Darstellungsveränderungen

    Guten Abend zusammen

    Ich habe ein Formularfeld, wo User einen Titel zu einer angegebenen Website eingeben können. Mein Wunsch wäre, dass dieses Formularfeld möglichst sicher gegen z.B. SQL-Injection wird. Zudem darf es mir anschliessend von der Darstellung des Titels z.B. auch keine Zeilenabstände geben, wenn jemand <br> im Formular eingegeben hat o.ä.

    Nun, ich habe mir überlegt mit folgenden zwei "Sachen" all diese "Probleme" zu umgeben:

    Ich setze 1. htmlspecialchars ein:
    PHP-Code:
    $titel htmlspecialchars(($_POST["titel"]), ENT_QUOTES); 
    Danach setze ich zusätzlich 2. mysql_real_escape_string ein:
    PHP-Code:
    $titel mysql_real_escape_string($titel); 
    ... Anschliessend speichere ich $titel in die MySQL-DB.

    Als Newbie habe ich im Moment noch das Gefühl, dass ich soweit gut gegen irgendwelche Angriffe oder Darstellungsveränderungen zurecht komme. Oder, täusche ich mich da gewaltig? Könntet ihr mich allenfalls aufklären, wie ich es "viel" besser machen sollte?

    Besten Dank und Gruss
    Kilu

  • #2
    Die mysql_ Funktionen sind seit einiger Zeit als deprecated (veraltet) gekennzeichnet und sollten so einfach nicht mehr verwendet werden. Beschäftige Dich doch mal mit PDO und beachte hier insbesondere den Abschnitt PDOStatement.

    Bei Deinem Ansatz solltest Du allerdings beachten, dass die Funktion htmlspecialchars() lediglich bei der Ausgabe von Daten angewendet werden sollte. Vor dem Speichern hat diese Funktion nichts zu suchen. Die Funktion htmlspecialchars() säubert die Eingaben auch nicht von HTML. Schau Dir hierzu bitte die Funktion strip_tags an.
    MM Newmedia | MeinBlog

    Kommentar


    • #3
      Habe ich das soweit richtig verstanden, dass ich anstelle von htmlspecialchars() das strip_tags() verwenden soll. Und zwar nicht vor dem Speichern in die DB, sondern erst vor dem Anzeigen auf der Website?

      Wichtig wäre für mich noch folgende Frage. Ist mysql_real_escape_string veraltet, oder nicht mehr sicher? Also, dürfte ich das weiterhin verwenden?

      Kommentar


      • #4
        alle mysql_*-Funktionen sind veraltet, benutz PDO.

        Kommentar


        • #5
          Zitat von Kilu Beitrag anzeigen
          Habe ich das soweit richtig verstanden, dass ich anstelle von htmlspecialchars() das strip_tags() verwenden soll. Und zwar nicht vor dem Speichern in die DB, sondern erst vor dem Anzeigen auf der Website?
          Die Funktion htmlspecialchars() macht eigentlich nur bei der Ausgabe Sinn. Ob Du die Funktion strip_tags() vor dem Speichern in der Datenbank nutzen möchtest, bleibt Dir überlassen. Wie ich aus Deinem ersten Beitrag herauslesen konnte, möchtest Du alle HTML Tags aus dem übergebenen String entfernen. Es macht also Sinn die Funktion strip_tags() vor dem Speichern in der Datenbank zu nutzen. Die Funktion htmlspecialchars() aber dann erst bei der Ausgabe.

          Zitat von Kilu Beitrag anzeigen
          Wichtig wäre für mich noch folgende Frage. Ist mysql_real_escape_string veraltet, oder nicht mehr sicher? Also, dürfte ich das weiterhin verwenden?
          Hier kann ich nur chorn wiederholen. Nutze statt der mysql_* Funktionen einfach PDO. Dann bist Du auf der sicheren Seite.
          MM Newmedia | MeinBlog

          Kommentar


          • #6
            Hallo ezkimo. Danke für deine Antwort.

            Im Prinzip ist es mir egal, ob es mir vor oder nach dem Speichern in die DB die gefährlichen Zeichen "abändert". Hauptsache ein User kann mit Falscheingaben nichts in der DB anrichten oder den Text irgendwie anders darstellen lassen.

            Weisst du was ich meine?

            Ich fasse deine Tipps nochmals kurz zusammen:

            - Es sollte reichen, wenn ich erst bei der Ausgabe strip_tags() anwende.
            - Wenn ich strip_tags() verwende, so kann ich htmlspecialchars() weglassen.
            - Ich sollte, wenn ich sicher gehen möchte, in Zukunft mit PDO arbeiten, damit gefährlicher Code nicht in die DB eingeschleust werden kann.

            Soweit korrekt?

            Kommentar


            • #7
              Ja, aber eins noch: Nur PDO zu verwenden schützt dich nicht. Du musst es auch so verwenden, wie es gedacht ist.

              Ein Code wie

              PHP-Code:
              $db->executeQuery("SELECT $x FROM $y WHERE $z"); 
              ist in keinster Weise sicherer, als der entsprechende mit den mysql_*-Funktionen.

              Verwende die Parameterfunktion von PDO, das ist das einzige was dich wirklich zuverlässig schützen kann.

              PHP-Code:
              $statement $db->prepare("SELECT :x FROM :y WHERE :z");
              $statement->bindParam("x"$x);
              $statement->bindParam("y"$y);
              $statement->bindParam("z"$z);
              $statement->execute(); 
              This is what happens when an unstoppable force meets an immovable object.

              Kommentar


              • #8
                Hi Kilu,
                Zitat von Kilu Beitrag anzeigen
                Könntet ihr mich allenfalls aufklären, wie ich es "viel" besser machen sollte?
                Wenn du dir auf dieser Seite SQL-Injection ? Wikipedia ansiehst, wie eine SQL-Injection "zusammen geschraubt" wird,
                könntest du eine Eingabe nur in soweit zulassen, wie sie erlaubte Zeichen enthält bzw. ob es der richtige, erwartete Variablentyp ist.

                Auch sind für bestimmte Befehle/Prozesse Root(Administrator)-Rechte nötig. Sofern dein Projekt also im Internet
                veröffentlicht wird/ist, logge dich im Script niemals als Root ein. Erstelle stattdessen ein Benutzerkonto und gib diesem Konto nur die Rechte,
                welche eine Funktionalität erfordern. Dafür gibt es die Befehle grant (Rechte gewähren) und revoke (Rechte entziehen).

                Siehe MySQL :: MySQL 5.1 Referenzhandbuch :: 13.5.1.3 GRANT und REVOKE

                Viele Anleitungen verwenden die MySQL-Funktionen mysql_error und mysql_errno, um Fehlermeldungen auszugeben.
                Verwende diese Funktionen nur bei der Entwicklung, denn auch aus systemeigenen Fehlermeldungen können Angreifer Rückschlüsse
                auf die/den Struktur/Inhalt deine(r)n DB/Tabellen ziehen.

                Fehlermeldungen, die durch Funktionen erzeugt werden, lassen sich auch unterdrücken, in dem man den Funktionen das @-Zeichen voranstellt . . .
                PHP-Code:
                $result = @mysql_query('insert  . . . into . . .  usw.'); 
                Generiere stattdessen eigene Fehlermeldungen, z.B. mit einer Exception, um Angreifern so wenig Info wie möglich zukommen zu lassen. Beispiel . . .
                PHP-Code:
                <?php
                /*
                * Die Funktion legt einen neuen Datensatz an.
                * Bei Mißerfolg (DatensatzNr. schon vorhanden) wird eine Exeption "geworfen" und false zurückgegeben.
                */
                function neuer_wert($param) {
                    
                $query="insert into test2 values('$param')";
                  
                $result=@mysql_query($query);
                  if (!
                $result) {
                          throw new 
                Exception("Auftragsnummer $param konnte nicht angelegt werden.");
                   return 
                false;
                      }
                  return 
                true;
                }
                /*
                * Versuche (try) neuen Datensatz anzulegen
                */
                $neu=817;
                try {
                    if(
                neuer_wert($neu)){
                   echo 
                "Auftragsnummer $neu wurde angelegt";
                  }

                /*
                * Bei Mißerfolg wird die in der Funktion erzeugte Exception ausgegeben.
                */
                catch (Exception $fehler) {
                    echo 
                $fehler->getMessage();
                }
                ?>
                Ist zwar jetzt kein Beispiel für eine SQL-Injection, soll nur verdeutlichen, dass unerlaubte/fehlerhafte Eingaben abgefangen werden können.

                Eine 100%tige Sicherheit wirst du nie hinbekommen, auch nicht mit PDO. Du kannst allerdings jede Menge im Vorfeld unternehmen,
                um Angreifern das Leben so schwer wie möglich zu machen.

                Gruß
                Günni

                Kommentar


                • #9
                  Hi,

                  hier auch noch eine Anleitung, wie man MySQL-Injections verhindern und prüfen kann: MySQL-Injection und Datenmanipulation verhindern*-*MySQL/PHP-Skripte absichern und schützen*-*PC-Erfahrung.de

                  Kommentar

                  Lädt...
                  X