Sicherheit der Daten und Eingaben einer Seite?

2Pac

Erfahrenes Mitglied
Hallo,

ich weiß das es einen langen Sicherheits Thread gibt. Aber so wirklich nach den ersten 3 Seiten hab ich nicht das gefunden, was ich suche.

Ich hatte vor mir das Buch PHP Sicherheit: Sicheres Programmieren von Web Anwendungen zu besorgen. Von Kunz und Esser.

Aber ich würde das gerne umgehen, da es doch recht teuer ist und man heutzutage eigentlich alles im Netz findet.

Ich schütze meine Seite im Moment vor SQL Injection durch mysql_real_string_escape und prüfe damit alle Eingaben, die ein User machen kann, sogar das was an Variablen über die URL übergeben wird.

Muss ich auch alle Datenbankvariablen auf die das Script zugreift ebenso schützen?

Weiterhin sperre ich einige Zeichen vor dem User wie {} < > um halt PHP und HTML Code zu vermeiden. Dazu kommen BBCodes für Fett Smilies etc.

Gibt es noch andere Lücken, die ich beachten muss um meine Seite zu schützen? Was würdet Ihr machen? Gibt es dazu vielleicht deutsche Tutorials?

Vielen Dank im Voraus
Ronny
 
aja hört sich doch schonmal recht gut an, ich für meinen Teil Öfnne bei bedarf die Verbindung zur MySQL Datenbank und nach Transaktion Schließe ich diese Sofort wieder da dies ab und zu mal unerwünschte Nebeneffekte haben könnte ;-) auch wenn es das Script ein wenig Verlangsamt :)
 
Auch wenn ich das Buch nicht direkt kenne, kann ich zunächst einmal Stefan Esser als Person empfehlen, hat sehr viel KnowHow.

Das prüfen der Datenbankvariablen muss nicht sein, solange diese fix sind, also nur von dir gegeben werden.
Grundsätzlich gilt hier, ALLES was beeinflusst werden kann (Cookies, Formulare, URL, Sessions, usw.) sollte gefiltert werden.

Beim Eintragen in die Datenbank reicht da meist ein [phpf]mysql_real_escape_string[/phpf]. Das Ausschlussverfahren würde ich nicht benutzen. Denn durch obige Funktion wird das Verändern des Queries ausgeschlossen.
Um JS Injektionen oder sonstige HTML Versuche zu verhindern, reicht meist das Ersetzen der HTML Symbole. [phpf]htmlspecialchars[/phpf] bzw. [phpf]htmlentities[/phpf] sind hier zu empfehlen.
Allerdings würde ich diese zur Ausgabe nutzen, nicht beim Eintragen in die Datenbank.
Dadurch hast du in der Datenbank den Urzustand und musst ihn beim edtieren oder sonstigen Aktionen nicht erst wieder umformen. Daten sollten so unbearbeitet wie möglich gespeichert werden, damit man sie je nach Zweck formatieren kann.

An deutschen Tutorials mangelt es in diesem Bereich ein wenig, wir haben dort auch nur wenig anzubieten, können aber hier spezifische Antworten geben.

Für den englischen Bereich kann ich hier gerne einige Links reinschmeißen, falls du Interesse hast.

Das Schließen der Verbindung ist in 90% der Fälle nur nützlich, wenn du nach dem Benutzen der Daten die Verbindung nicht mehr brauchst, das Skript aber noch viel arbeiten wird.
Sofern man nicht persistente Verbindungen benutzt, schließt PHP die Verbindung zu MySQL automatisch am Ende des Skripts.
 
Ich hatte vor mir das Buch PHP Sicherheit: Sicheres Programmieren von Web Anwendungen zu besorgen. Von Kunz und Esser.

Aber ich würde das gerne umgehen, da es doch recht teuer ist und man heutzutage eigentlich alles im Netz findet.

Und in einer Bibliothek. Wenn man Studierende kennt, dann kommst da bestimmt für ein Monat umsonst dran. Wenn deine kleine Bibliothek um die Ecke das nicht hat, dann frage nach einer Fernleihe - die besorgen das gegen einen geringen Obolus.

Was in dem Buch meiner Meinung nach fehlt, ist der Aspekt, dass die Algorithmen (z.B. zum speichern und lesen von Passwörtern) am sichersten verstaut seien müssen. Das ist zwar Aufgabe der Domäne, aber sollte wenigstens mal genannt werden.



Was würdet Ihr machen? Gibt es dazu vielleicht deutsche Tutorials?

Englische Tutorials und Texte suchen, sonst hast du (um mal einen schönen englischen Begriff aus der VWL zu nennen) "Time-Lags". Die Programmiererwelt spricht Englisch und veröffentlicht in Englisch. Das es etwas dauert bis die Sachen ins deutsche Übersetzt werden, falls sie überhaupt jemand übersetzt, weist du selbst. Das geht von 1 Tag bis weit über 1 Monat, bevor man etwas wissenswertes dann auch auf deutsch lesen kann und so lang rennt man mit unsicheren Sachen herum. Zudem gehen bei der Übersetzung häufig Informationen verloren.

Es gibt Mailinglisten, wo man bei richtigen Sicherheitsexperten Diskussionen mitlesen kann oder selbst welche anfängt: http://www.securityfocus.com/

Aber du hast recht, im Grunde wäre ein solches Buch eine Sammlung von Infos aus dem Netz, die dann natürlich schon veraltet sind.
 
Zuletzt bearbeitet:
Also ich habe genau dieses Buch, und ich muss sagen das es mir sehr weitergeholfen hat.
Es ist sehr gut erklärt und einfach zu verstehen und umfasst eigentlich fast alles was man in Punkto Sicherheit Wissen muss.

Wenn du allerdings billiger wegkommen willst gibt es da noch die Google Suche :)

du findest eigentlich viele Sachen was in den Bereich Sicherheit von PHP hinein geht im Web.

Schau dir mal hier die Tutorials unter PHP an da gibts auch schon einige interessante Dinge zu finden.

Sichere PHP Include Links

Sicherheitsfokus Formulare vor Manipulation Schützen

sicherheitsfokus-passwoerter-sicher-speichern

sicherheitsfokus-validieren-filtern-und-maskieren

sichere-datenbankzugriffe-durch-prepared-statements

usw..
 
Du solltest dich bei der Buchsuche nicht auf PHP allein beschränken. Ich hatte vor Jahren mal Sicherheitsrisiko Web-Anwendung gelesen, das sprachübergreifende Sicherheitsrisiken benennt und somit auch auf andere Bereiche übertragbar ist. Ich fand das wesentlich hilfreicher als das ewige allein PHP-spezifische Zeug zu lesen, das ich bereits kannte.
 
Danke erstmal für die zahlreichen und hilfreichen Beiträge.

Auch wenn ich das Buch nicht direkt kenne, kann ich zunächst einmal Stefan Esser als Person empfehlen, hat sehr viel KnowHow.

Das prüfen der Datenbankvariablen muss nicht sein, solange diese fix sind, also nur von dir gegeben werden.
Grundsätzlich gilt hier, ALLES was beeinflusst werden kann (Cookies, Formulare, URL, Sessions, usw.) sollte gefiltert werden.

Beim Eintragen in die Datenbank reicht da meist ein [phpf]mysql_real_escape_string[/phpf]. Das Ausschlussverfahren würde ich nicht benutzen. Denn durch obige Funktion wird das Verändern des Queries ausgeschlossen.
Um JS Injektionen oder sonstige HTML Versuche zu verhindern, reicht meist das Ersetzen der HTML Symbole. [phpf]htmlspecialchars[/phpf] bzw. [phpf]htmlentities[/phpf] sind hier zu empfehlen.
Allerdings würde ich diese zur Ausgabe nutzen, nicht beim Eintragen in die Datenbank.
Dadurch hast du in der Datenbank den Urzustand und musst ihn beim edtieren oder sonstigen Aktionen nicht erst wieder umformen. Daten sollten so unbearbeitet wie möglich gespeichert werden, damit man sie je nach Zweck formatieren kann.

An deutschen Tutorials mangelt es in diesem Bereich ein wenig, wir haben dort auch nur wenig anzubieten, können aber hier spezifische Antworten geben.

Für den englischen Bereich kann ich hier gerne einige Links reinschmeißen, falls du Interesse hast.

Das Schließen der Verbindung ist in 90% der Fälle nur nützlich, wenn du nach dem Benutzen der Daten die Verbindung nicht mehr brauchst, das Skript aber noch viel arbeiten wird.
Sofern man nicht persistente Verbindungen benutzt, schließt PHP die Verbindung zu MySQL automatisch am Ende des Skripts.

Wie gesagt ich dachte eigentlich ich kann HTML / PHP durch das auslesen des Strings und überprüfen auf die 4 Zeichen {} < > verhindern. Oder ist das nicht sinnvoll / sicher?

Zum sichern der Eingabedaten wie du sagtest Cookies, Sessions etc.

Das heißt ich sollte stehts ein Escape der Session Variablen durchführen?

Also macht es keinen Sinn die Verbindung nach dem ich mir die Daten eingeholt habe sofort wieder zu beenden, sondern reicht es aus, wenn ich Sie am Ende des Scripts beende? Oder ist das abhängig von der Länge des Scripts? Wenn ja ab welcher Länge würde es denn Sinn machen?

Was in dem Buch meiner Meinung nach fehlt, ist der Aspekt, dass die Algorithmen (z.B. zum speichern und lesen von Passwörtern) am sichersten verstaut seien müssen. Das ist zwar Aufgabe der Domäne, aber sollte wenigstens mal genannt werden.

Und wie erreiche ich das ich die Algorithmen zum Speichern und Lesen von Passwörtern gut und sicher verstaue?
 
Und wie erreiche ich das ich die Algorithmen zum Speichern und Lesen von Passwörtern gut und sicher verstaue?

Natürlich alles um das Skript, welches den Algorithmus enthält, sicher machen (PHP selbst, Firewall, Webserver, etc.). Beispiel zu Webserver Konfiguration (hier: Apache HTTPD):
"Option -Index" verhindert, dass der Inhalt freier Ordner als Dateiliste angezeigt wird.
"ServerSignature Off" verhindert, dass bei Fehlerseiten die Konfiguration des HTTPD angezeigt wird.
"ServerTokens Prod" verhindert, dass Details über HTTPD jedesmal im Header versandt werden.
usw: http://www.petefreitag.com/item/505.cfm
 
Kannst du mir noch den Vorteil / Unterschied von Prpared Statements erklären?

Ich hab mir das gerade durchgelesen, aber was genau der Vorteil dabei zur herkömmlichen SQL Abfrage ist habe ich nicht entdecken können. Hab ichs vielleicht übersehen? ;)

Danke nochmal ich werde mir das zu Herzen nehmen.

Noch eine Frage ich include im Moment die Dateien vom Server via Datenbank:

Code:
index.php?section=Home

PHP:
include("$section.php");

Hab gerade gelesen, dass das falsch wäre und ich liebe zuweisen sollte via Array. Das mach ich wie?

PHP:
$section['Home'] = "Home.php";

include($section);

oder wie?

Danke nochmal..

Achso noch was. Ich kann ja auf die Variable $section auch so zugreifen. Welchen Vorteil bringt mir $_POST oder $_GET gegenüber dem Zugreifen auf die Variable $section? Gibt es da einen?
 
Zuletzt bearbeitet:
Hab gerade gelesen, dass das falsch wäre und ich liebe zuweisen sollte via Array. Das mach ich wie?

Schau dir mal hier die Tutorials unter PHP an da gibts auch schon einige interessante Dinge zu finden.

Sichere PHP Include Links

Zu dem PreparedStatement:
http://de.wikipedia.org/wiki/Prepared_Statement hat gesagt.:
Mittels Prepared Statements können SQL-Injections effektiv verhindert werden, da das Datenbanksystem die Gültigkeit von Parametern prüft, bevor diese verarbeitet werden. Soll ein Statement mit unterschiedlichen Parametern mehrere Male (z. B. innerhalb einer Schleife) auf dem Datenbanksystem ausgeführt werden, erreicht man mit Prepared Statements einen deutlichen Geschwindigkeitsvorteil [...]

Nachteile kenne ich bisher noch keine.
 
Zurück