Sven Rautenberg: Sicherheit

Beitrag lesen

Moin!

Bin im Moment noch Anfänger... Nach dem Lesen von unmengen an Theorie ist einiges noch unklar...
Hoffe hier bekomme ich eine Antwort auf folgende Fragen... Oder zumindest eine Anlaufstelle...

Webapplikations-Sicherheit ist ein sehr komplexes Thema, weil es viele verschiedene Stellen innerhalb der Applikation gibt, an der jenen jeweils unterschiedliche Probleme auftreten können. Am einfachsten ist es daher, sich nicht zuerst mit dem Gesamtsytem zu beschäftigen, sondern anhand der Einzelteile jeweils die typischen Anfälligkeiten kennenzulernen. Wenn man an jeder einzelnen Stelle alles richtig macht, sieht die Gesamtsicherheit automatisch viel besser aus.

Eine gute Anlaufstelle für Websicherheit ist OWASP. Die geben eine Top 10 Liste heraus mit den typischen Sicherheitslücken in Websoftware.

Es gibt den Anfang einer deutschsprachigen Wiki-Seite dazu: OWASP Top 10 für Entwickler

Das englische Original: OWASP Top 10 - die Ausgabe von 2013 ist gerade im Entstehen, die noch aktuelle Version ist von 2010.

Die OWASP Top 10 listen eigentlich die gesamte Vielfalt an Angriffen auf, denen eine Software ausgesetzt ist. Sie beschreiben aber nicht direkt, was man dagegen tun kann - dazu gibts die "Cheat Sheets" - beispielsweise das SQL Injection Prevention Cheat Sheet.

Dieses listet allerdings auch wieder noch nicht direkt auf, wie man SQL Injection konkret in PHP verhindert - dazu braucht es einerseits das Wissen, welche Datenbank verwendet wird, und zweitens dann dazugehörig das Wissen, wie man in PHP mit dieser Datenbank Escaping oder Stored Procedures verwendet.

Wie du siehst, ist nur für diesen einen Teilaspekt "SQL Injection" als Untergruppe von "Top A1: Injections" Wissen auf recht vielen Ebenen notwendig, wenn man von oben ausgeht und "Sicherheit" will. Allerdings führt kein Weg drum herum: Sicherheit entsteht nur, indem man alle Unsicherheitsaspekte kennt oder nachlesen kann, und entsprechend handelt.

Andererseits ist es weit weniger schlimm, als es für dich jetzt vielleicht aussieht: In einer kleinen, typischen Gästebuch-Applikation sind die Transportwege der Daten übersichtlich und nicht ausufernd, du hast es also nicht mit der kompletten Liste an Top10-Problemen zu tun, und die, die zutreffen, sind in deiner Situation recht simpel zu berücksichtigen, weil du keine komplexe Applikation schreibst: Viele Aspekte treffen einfach nicht zu.

Wenn man es wirklich herunterbricht auf den kleinstmöglichen Level, lautet die generelle Antwort gegen alle Probleme: Kontextgerecht escapen! Details stehen bei SELFHTML im Wiki: http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

Wie funktioniert das mit PHP und Sicherheit? Wie kann ich zum Beispiel meine Datenbankpasswörter schützen, bzw. verhindern das ein User Zugriff auf meine ungeparste PHP-Datei hat?

Ungeparste PHP-Dateien entstehen nur, wenn der Webserver falsch konfiguriert ist. Aber um doppelt sicherzugehen, legt man solche Dateien gern außerhalb des konfigurierten Document-Root-Verzeichnisses ab (das ist das Verzeichnis, dessen index.html oder index.php erscheint, wenn man "www.example.org/" eingibt). Außerhalb heißt: Auf Dateisystemebene des Servers ein Verzeichnis weiter nach oben, und dort ggf. in ein anderes Unterverzeichnis. PHP greift auf diese Datei nicht als URL zu (das geht ja auch nicht mehr, würde außerdem nicht funktionieren, da dann der Quellcode nicht ausgeliefert wird, sondern das ausgeführte Skript-Ergebnis), sondern auch über das Dateisystem.

Allgemein, wie ist ein Webverzeichnis aufgebaut?

Es gibt irgendwo ein Verzeichnis als Document-Root. Wenn dein Webanbieter gut ist, lässt er dich via SFTP, SCP oder (leider, weil unverschlüsselt) FTP auf deinen Webspace zugreifen, so dass du in deinem Webspace beliebig Verzeichnisse erstellen kannst, und in der Konfigurationsoberfläche erlaubt er dir dann die Auswahl eines Verzeichnisses als "Hauptverzeichnis" deiner Webseite. Eventuell ist das ganze auch festverdrahtet, so dass z.B. schon ein Verzeichnis "public", "html" oder "htdocs" in deinem Webspace erscheint, und du daneben weitere Verzeichnisse erstellen kannst.

Außer der Unterscheidung zwischen Verzeichnissen und Dateien innerhalb der Document-Root-Verzeichnisse (per HTTP erreichbar) und außerhalb (unerreichbar) gibt es keine technischen Vorgaben - das ist im Prinzip alles dir überlassen. Wenn man allerdings diverse Frameworks einsetzt, hat sich etabliert, den PHP-Code möglichst außerhalb zu platzieren, und nur eine kleine index.php innerhalb des Document-Root zu speichern, die ihrerseits dann die Applikation außerhalb aufruft und startet. Das verhindert recht effektiv, dass man einzelne PHP-Skripte als Angreifer direkt ansteuern kann.

Für ein schlichtes Gästebuch ist das allerdings nicht zwingend nötig.

Alle anderen Dateien, die an den Browser ausgeliefert werden sollen, also pures HTML, CSS, Javascript, Bilder u.ä. müssen innerhalb des Document-Root platziert werden, sonst kann der Browser sie nicht abrufen.

Zum Beispiel Wo kommt ein Javascript File, wo ein PHP File, wo die Html Files und Wo zum Beispiel ein Bild? Wie sieht das ganze punkto Sicherheit aus?

Server-Sicherheit ist bei diesen Ressourcen (außer PHP) nicht relevant, weil diese statischen Dateien nicht auf dem Server ausgeführt werden. Die Ordnung sollte sich aus deiner Programmierung heraus ergeben: Dort, wo die Dateien sinnvoll platziert sind, solltest du sie ablegen. Mir fällt dazu kein sinnvolles, immer gültiges Schema ein, dass man anwenden sollte.

Bedenke allerdings, dass die URL für Suchmaschinen interessant ist. Und der Pfad innerhalb des Document-Root zu den Dateien ist automatisch Bestandteil der URL. Es ist also schlau, hier sinnvolle Worte zu verwenden, genauso wie für die Dateinamen selbst. Zumindest für HTML-Dateien (Bilder, CSS und Javascript werden ja nicht direkt vom Browser aufgerufen, sondern nur nachgeladen).

Möchte mich in kürze an meiner ersten Website versuchen... Eine kleine feine Website über einen Kleinbetrieb... Dort soll auch ein Gästebuch zum Einsatz kommen, wo für ich PHP verwenden will...

Du solltest dir unbedingt lokal einen Webserver installieren, damit du ohne dass die ganze Welt schon zugreifen kann, deine Webseite ausprobieren kannst. Insbesondere PHP erfordert das, ansonsten würde der PHP-Code nicht ausgeführt werden.

Mögliche Lösungen sind XAMPP, oder als Virtuelle Maschine z.B. VirtualBox mit Vagrant und einem passenden Image (das ist allerdings die technisch aufwendigere Lösung, die von dir erfordert, dass du dich mit Serveradministration besser auskennst).

- Sven Rautenberg