Eingabe richtig Filtern und maskieren

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

  • Eingabe richtig Filtern und maskieren

    Hallo zusammen,

    Ich habe mir ein kleines Newsscript geschrieben. Mit Sicherheit hatte ich vorher nie viel zu tun. Daher habe ich mich schon selber über Probleme wie mysql injection oder Cross-Site Scripting Informiert. Ich denke das ich alle Ratschläge gut umsetzten konnte um die Sicherheit zu gewährleisten.
    Aber nun zu meiner Frage, ich lasse die Benutzer auch Kommentare schreiben.

    Vor dem Absenden muss man ein captcha eingeben. Die Eingabe maskiere ich so:

    PHP-Code:
    $artikelid = (int)$_POST['id'];
            if(isset(
    $_POST['nachricht']) && !empty($_POST['nachricht']) && !is_array($_POST['nachricht']))
                
    $nachricht htmlspecialchars($_POST['nachricht']);
                
    $nachricht strip_tags($nachricht);
                
    $nachricht stripslashes($nachricht);
                
    $nachricht mysql_real_escape_string($nachricht);
            } 
    Nun meine Frage an die Experten, ist das so ok oder habe ich etwas Elementares vergessen?

  • #2
    Da gibt es zwei kleine Unstimmigkeiten im Script:
    - Da du strip_tags() nach htmlspecialchars() anwendest, bleibt strip_tags() wirkungslos.
    - Und stripslashes() arbeitet nach htmlspecialchars() auch nicht mehr zuverlässig.

    Wenn, dann würde ich es so machen:
    PHP-Code:
    $artikelid = (int)$_POST['id'];
            if(isset(
    $_POST['nachricht']) && !empty($_POST['nachricht']) && !is_array($_POST['nachricht']))
                
    $nachricht stripslashes($_POST['nachricht']);
                
    $nachricht strip_tags($nachricht);
                
    $nachricht htmlspecialchars($nachricht);
                
    $nachricht mysql_real_escape_string($nachricht);
            } 
    Eventuell würde ich strip_tags() rausnehmen, da HTML mit htmlspecialchars() schon unschädlich gemacht wird.

    Ansonsten sieht das Vorgehen sehr sicher aus.
    Auswahl an PHP- und weiteren Scripts auf meiner Website.

    Kommentar


    • #3
      Zitat von Abwesend Beitrag anzeigen
      ..., ich lasse die Benutzer auch Kommentare schreiben.

      Vor dem Absenden muss man ein captcha eingeben. Die Eingabe maskiere ich so:

      PHP-Code:
      $artikelid = (int)$_POST['id'];
              if(isset(
      $_POST['nachricht']) && !empty($_POST['nachricht']) && !is_array($_POST['nachricht']))
                  
      $nachricht htmlspecialchars($_POST['nachricht']);
                  
      $nachricht strip_tags($nachricht);
                  
      $nachricht stripslashes($nachricht);
                  
      $nachricht mysql_real_escape_string($nachricht);
              } 
      Nun meine Frage an die Experten, ist das so ok oder habe ich etwas Elementares vergessen?
      Nunja, zumindest der gute Wille ist anzuerkennen ...

      Einfach alle "Sicherheitsfunktionen" hintereinander zu schalten, bringt exakt gar nichts. Im besten Fall verstümmelst du die Benutzereingaben zur Unkenntlichkeit.

      Die Grundregel lautet: Benutze die passende Filterfunktion für den entsprechenden Kontext![1]
      • Willst du (Text-)Daten in die HTML-Ausgabe einbetten, benutze htmlspecialchars(). Nur bei der Ausgabe!
      • Willst du die Eingaben des Benutzers in eine Datenbank schreiben, benutze mysql_real_escape_string() oder die passende Escape-Funktion des von dir verwendeten Datenbanktreibers.
      • Soll Text in eine URL eingefügt werden, benutze rawurlencode().


      Guckst du auch hier für umfangreichere Erklärungen:
      Kontextwechsel erkennen und behandeln


      Lass lieber die Finger von unsinnigen Funktionen wie strip_tags() und strip_slashes(). Die richten meist mehr Schaden an, als sie Gutes bewirken können.

      Strip_tags() entfernt Teile des übergebenen Textes, lies sich aber in der Vergangenheit mit überlangen "Tags" austricksen. Damit konnte dann wieder "gefährliches HTML" eingeschmuggelt werden.

      Strip_slashes() brauchst du bei einer sauberen PHP-Installation nicht. Und falls das schwachsinnige Magic-Quoting tatsächlich aktiviert sein sollte, hilft strip_slashes() nicht in allen Fällen, die richtigen Backslashes wegzumachen.

      --
      [1] Ich finde zwar Kontext ein schreckliches (deutsches) Wort, aber was solls: So lange einem nichts Passenderes einfällt.
      Zuletzt geändert von fireweasel; 18.01.2010, 13:44.
      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

      Kommentar


      • #4
        Hallo und danke für eure Antworten,

        also, da magic quotes bei mir aktiviert ist sollte ich ich stripslashes() auf jeden Fall machen, zumindest laut PHP.net :

        Hinweis: Ist magic_quotes_gpc aktiviert, wenden Sie zuerst stripslashes() auf die Daten an. Das Bearbeiten bereits in irgend einer Form maskierter Daten durch mysql_real_escape_string führt ansonsten dazu, dass bereits Maskiertes doppelt maskiert wird.
        Das mysql_real_escape_string() Auf jeden Fall genommen werden sollte ist mir klar.
        Da es bei diesem Skipt um Kommentare handelt, sollte ja auch die Eingabe 1 zu 1 wiedergegeben werden. Daher ist doch htmlspecialchars() sowieso zu Empfehlen?!

        Das ist zumindest das was ich mir dabei gedacht habe. Ich lerne ja immer gerne dazu! Wenn ich dich also richtig verstanden habe, ist in diesem Fall strip_tags fehl am Platz?

        Kommentar


        • #5
          htmlspecialchars hat aber nichts mit SQL zu tun. Das kannst du anwenden, wenn die Daten aus der DB rauskommen und angezeigt werden sollen. Auf die Beachtung des Kontext wurdest du schon hingewiesen.

          Gruß,

          Amica
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Zitat von Abwesend Beitrag anzeigen
            Hallo und danke für eure Antworten,

            also, da magic quotes bei mir aktiviert ist sollte ich ich stripslashes() auf jeden Fall machen, ...
            Welcher Hoster konfiguriert seine Server heutzutage noch so schwachsinnig?

            Nehmen wir mal an, dass du um die "magischen Hochkommas" nicht herumkommst. Dann solltest du trotzdem besser prüfen, ob sie aktiviert sind. Sie können in absehbarer Zeit auch abgeschaltet werden. In dem Fall würde stripslashes() ohne Vorsichtsmaßnahmen Benutzereingaben kaputt machen. Das mindeste wäre die Abfrage per get_magic_quotes_gpc():

            PHP-Code:
            if (get_magic_quotes_gpc()) {
                
            $input strip_slashes($_POST['input']);
            }
            else {
                
            $input $_POST['input'];

            Das mysql_real_escape_string() Auf jeden Fall genommen werden sollte ist mir klar.
            Bei jedem Fall, wo du Benutzereingaben in Datenbank-Queries einbaust. In den anderen Fällen kannst du darauf verzichten.

            Da es bei diesem Skipt um Kommentare handelt, sollte ja auch die Eingabe 1 zu 1 wiedergegeben werden. Daher ist doch htmlspecialchars() sowieso zu Empfehlen?!
            Aber nur bei der Ausgabe als HTML-Text. Auch hier mal ein Beispiel, das verdeutlicht, wo und wie htmlspecialchars() eingesetzt werden muss:
            PHP-Code:
            // eine Benutzereingabe
            $linkbeschreibung $_GET['artikel'];
            // magic quotes sind off

            // man stelle sich in $linkbeschreibung 
            // irgendwas mit ä,ö,ü, ß oder anderen 
            // nicht URL-freundlichen Zeichen vor, etwa
            // Kategorie:Süßwasseramöbe ;)

            // eine URL 
            $linkziel 'http://de.wikipedia.org/wiki/' 
                      
            rawurlencode($linkbeschreibung); 

            // ein HTML-Gerüst (oberer Teil)
            $html '<html><head></head><body><div>';
            // ein Link
            $html .= sprintf(
                
            '<a href="%s">%s</a>',
                
            htmlspecialchars($linkzielENT_QUOTES),
                
            htmlspecialchars($linkbeschreibung)
            );
            // HTML-Gerüst (restlicher Teil)
            $html .= '</div></body></html>';

            echo 
            $html
            Wenn ich dich also richtig verstanden habe, ist in diesem Fall strip_tags fehl am Platz?
            Um dich selbst zu zitieren:

            Da es bei diesem Skipt um Kommentare handelt, sollte ja auch die Eingabe 1 zu 1 wiedergegeben werden.
            Du möchtest schließlich die Benutzereingaben erhalten und nichts rauslöschen.

            In meinen Augen ist strip_tags() IMMER fehl am Platz. Ich kenne keine nützliche praktische Anwendung dieser Funktion. Die meisten wollen eigentlich die Funktionialität von htmlspecialchars(), wenn sie strip_tags() oder htmlentities() benutzen.
            Zuletzt geändert von fireweasel; 18.01.2010, 15:25.
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar


            • #7
              OffTopic:
              Strip Tags kann immer dann sinnvoll sein, wenn man einen HTML-Quelltext als Grundlage hat und nur wesentliche Informationen Filtern will.

              Aber bei der Validierung von Benutzereingaben machts in der Regel tatsächlich mehr kaputt als dass es nützt.

              Kommentar


              • #8
                Zitat von TobiaZ Beitrag anzeigen
                OffTopic:
                Strip Tags kann immer dann sinnvoll sein, wenn man einen HTML-Quelltext als Grundlage hat und nur wesentliche Informationen Filtern will.
                ...
                OffTopic:

                Für den Zweck hätte ich wahrscheinlich preg_replace() oder einen selbstgestrickten HTML-"Parser" angeschmissen.

                Mal kucken, wie sich strip_tags() im Vergleich dazu macht. Mir schwant, es könnte diversen Text auch zwischen den <script>- und <style>-Tags stehen lassen ...

                Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                Kommentar

                Lädt...
                X