Franky: Sicherheitsaspekte

Hi,

ich programmiere jetzt schon etwas länger mit PHP, habe mir aber noch keine großen Gedanken um die Sicherheit gemacht. Bisher war das auch nicht wirklich nötig. Nun würde es mich aber interessieren auf was man achten sollte. Habe bisher eigentlich nur mysql_real_escape_string() verwendet.

Habe auch gehört das man kein HTML bei Benutzereingaben zulassen sollte. Stimmt das? Warum wäre das wichtig?

Wie siehts mit Sessions aus. Gibts da Sicherheitslücken die man schließen sollte?

Wäre sehr dankbar für Tipps!

Grüße Franky

  1. Hallo,

    Ich fang mal langsam an und duche mir einen Punkt raus *augenzuhalt und finger auf Monitor drueck* Ahhh!

    Habe auch gehört das man kein HTML bei Benutzereingaben zulassen sollte. Stimmt das? Warum wäre das wichtig?

    Na, denk doch mal nach. Stell Dir vor jemand baut gemuetlich ein Javascript in Deine Seite ein...

    Nehmen wir mal ein Gaestebuch oder eine Kommentarfunktion:

    Jemand baut Javascript in einen eintrag, ruft diesen auf und kann damit theoretisch deine Seite steuern. Er kann eigentlich treiben was er will.

    Selbst wenn wir das mal aussen vorlassen. Nehmen wir Image Tags: Das heisst jeder kann JEDES Bild in beliebeiger Anzahl auf deine Seite bauen. Wenn Du z.B. ein Gaestebuch moechtest wo du jeden Tag Eintraege mit 100 rechtsradikalen, terroristischen, ... Grafiken loeschen darfst, dann lass das mal ruhig zu. Immer wieder schoen so Witzbolde die auf 20MB grosse Grafiekn verlinken oder absichtlich Fehler verursachen...

    1. Hi,

      ja, an diese Bildergeschichten hab ich auch gedacht, aber nicht an javascript. Das sollte man natürlich verhindern. Gäbe es denn vielleicht eine Möglichkeit teilweise html zuzulassen? So dass man mal ein kleines Bild einbauen könnte oder etwas fett schreiben kann oder so?

      Danke schon mal für den ersten hinweis! Was gibts sonst noch?

      grüße franky

      1. Gäbe es denn vielleicht eine Möglichkeit teilweise html zuzulassen? So dass man mal ein kleines Bild einbauen könnte oder etwas fett schreiben kann oder so?

        Ja. Liest eigentlich uberhaupt keiner mehr Dokumentationen??

      2. Hi

        Natürlich kannst du bestimmte HTML-Tags auch zulassen, nur ergibt sich dan beispielsweise die Problematik, dass du auch in img Tags JavaScript-Code einpflanzen kannst.
        Am besten verwendest du dazu schon bestehende Klassen wie zB PEAR: HTML_safe oder HTML Purifier, da man von solchen Vorgängen als 'startender Fortgeschrittener' noch besser die Finger lässt.

        Gruß
        Moe

  2. echo $begrüßung;

    Habe auch gehört das man kein HTML bei Benutzereingaben zulassen sollte. Stimmt das?

    Wenn du alles was gefährlich ist auf eine schwarze Liste setzt, wie stellst du sicher, dass du nichts vergessen hast? Wichtiger als das Kontrollieren auf bestimmte Eingangswerte ist das Verhindern von Code in der Ausgabe. Wenn du irgendwann zu neuen sicherheitsrelevnten Erkenntnissen kommst, wirfst du ja nicht alle vorhandenen Daten weg und lässt sie neu eingeben, damit sie auch ja durch den aktuellen Filter laufen. Deswegen solltest du dein Augenmerk mehr auf die Ausgabe legen. Wenn du nicht möchtest, dass der Empfänger Daten als Code interpretiert, dann musst du die Regeln der Dateneinbettung im Code befolgen. Als Lehrsatz formuliert: Daten sind immer kontextgerecht zu behandeln.

    Um nur mal einige der wichtigsten Kontexte zu nennen:

    Um Strings im Kontext MySQL-Statement einzufügen, gelten die Regeln für Strings, die von mysql_real_escape_string() berücksichtigt werden.
    Um Daten im Kontext URL einzufügen, gelten die Regeln, die von url_encode() berücksichtigt werden.
    Um Daten im Kontext HTML einzufügen, gelten die Regeln für HTML-eigene Zeichen, die von htmlspecialchars() berücksichtigt werden.
    Um Daten in Javascript-Strings auszugeben, gibt es ebenfalls entsprechende Regeln, aber keine spezielle PHP-Funktion.

    Mitunter kommt es vor, dass Kontexte ineinandergeschachtelt werden. Z.B. werden Daten in einer URL versendet, die in HTML eingebettet werden soll. Dann betrachtet man zunächst den inneren Kontext und  erhält eine Zeichenfolge. anschließend beachtet man nicht weiter, dass es einen inneren Kontext gab und behandelt die Zeichenfolge Zeichen für Zeichen gemäß äußerem Kontext.

    Wie siehts mit Sessions aus. Gibts da Sicherheitslücken die man schließen sollte?

    Das einzige, was der Client von einer Session mitbekommt, ist die Session-ID. Über deren Übertragung von und zum Client lässt sich das PHP-Handbuch im Session-Kapitel aus.

    echo "$verabschiedung $name";