Frage

Was sind einige Richtlinien für die Aufrechterhaltung einer verantwortungsvollen Sitzungssicherheit mit PHP?Es gibt überall im Internet Informationen und es ist an der Zeit, dass sie alle an einem Ort landen!

War es hilfreich?

Lösung

Es gibt ein paar Dinge, die Sie tun müssen, um Ihre Sitzung sicher zu halten:

  1. Verwenden Sie SSL, wenn Sie Benutzer authentifizieren oder vertrauliche Vorgänge durchführen.
  2. Generieren Sie die Sitzungs-ID neu, wenn sich die Sicherheitsstufe ändert (z. B. beim Anmelden).Wenn Sie möchten, können Sie die Sitzungs-ID sogar bei jeder Anfrage neu generieren.
  3. Gönnen Sie sich eine Auszeit für die Sitzungen
  4. Verwenden Sie keine Register-Globals
  5. Speichern Sie Authentifizierungsdetails auf dem Server.Das heißt, senden Sie keine Details wie den Benutzernamen im Cookie.
  6. Überprüf den $_SERVER['HTTP_USER_AGENT'].Dies stellt eine kleine Hürde für Session-Hijacking dar.Sie können auch die IP-Adresse überprüfen.Dies führt jedoch zu Problemen für Benutzer, deren IP-Adresse sich aufgrund des Lastausgleichs auf mehreren Internetverbindungen usw. ändert (was in unserer Umgebung hier der Fall ist).
  7. Sperren Sie den Zugriff auf die Sitzungen im Dateisystem oder verwenden Sie eine benutzerdefinierte Sitzungsbehandlung
  8. Erwägen Sie bei sensiblen Vorgängen, dass angemeldete Benutzer ihre Authentifizierungsdaten erneut angeben müssen

Andere Tipps

Eine Richtlinie ist, anzurufen session_regenerate_id jedes Mal, wenn sich die Sicherheitsstufe einer Sitzung ändert.Dies trägt dazu bei, Session-Hijacking zu verhindern.

Meine zwei (oder mehr) Cent:

  • Traue niemandem
  • Filtereingabe, Escape-Ausgabe (Cookie, Sitzungsdaten sind auch Ihre Eingabe)
  • Vermeiden Sie XSS (halten Sie Ihr HTML gut formatiert, schauen Sie sich an PHPTAL oder HTMLPurifier)
  • Verteidigung in der Tiefe
  • Geben Sie keine Daten preis

Zu diesem Thema gibt es ein kleines, aber gutes Buch: Grundlegende PHP-Sicherheit von Chris Shiflett.

Grundlegende PHP-Sicherheit http://shiflett.org/images/essential-php-security-small.png

Auf der Startseite des Buches finden Sie einige interessante Codebeispiele und Beispielkapitel.

Sie können die oben erwähnte Technik (IP und UserAgent) verwenden, die hier beschrieben wird: So vermeiden Sie Identitätsdiebstahl

Ich denke, eines der Hauptprobleme (das in PHP 6 behoben wird) ist register_globals.Im Moment eine der Standardmethoden zur Vermeidung register_globals ist die zu verwenden $_REQUEST, $_GET oder $_POST Arrays.

Der „richtige“ Weg, es zu machen (ab 5.2, obwohl es dort ein wenig fehlerhaft ist, aber stabil ab 6, was bald kommt) ist durch Filter.

Also statt:

$username = $_POST["username"];

Du würdest:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

oder auch nur:

$username = filter_input(INPUT_POST, 'username');

Dieses Sitzungsfixierungspapier hat sehr gute Hinweise darauf, wo ein Angriff erfolgen könnte.Siehe auch Sitzungsfixierungsseite bei Wikipedia.

Die Verwendung einer IP-Adresse ist meiner Erfahrung nach nicht wirklich die beste Idee.Zum Beispiel;Mein Büro verfügt über zwei IP-Adressen, die je nach Auslastung verwendet werden, und bei der Verwendung von IP-Adressen treten ständig Probleme auf.

Stattdessen habe ich mich dafür entschieden, die Sitzungen in einer separaten Datenbank für die Domänen auf meinen Servern zu speichern.Auf diese Weise hat niemand im Dateisystem Zugriff auf diese Sitzungsinformationen.Das war bei phpBB vor 3.0 wirklich hilfreich (sie haben es inzwischen behoben), aber ich denke, es ist immer noch eine gute Idee.

Das ist ziemlich trivial und offensichtlich, aber stellen Sie sicher, dass Sie es tun session_destroy nach jedem Gebrauch.Dies kann schwierig zu implementieren sein, wenn sich der Benutzer nicht explizit abmeldet. Daher kann hierfür ein Timer eingestellt werden.

Hier ist ein gutes Lernprogramm auf setTimer() und clearTimer().

Das Hauptproblem bei PHP-Sitzungen und der Sicherheit (neben Session-Hijacking) liegt in der Umgebung, in der Sie sich befinden.Standardmäßig speichert PHP die Sitzungsdaten in einer Datei im temporären Verzeichnis des Betriebssystems.Ohne besondere Überlegung oder Planung ist dies ein weltweit lesbares Verzeichnis, sodass alle Ihre Sitzungsinformationen für jeden mit Zugriff auf den Server öffentlich sind.

Was die Aufrechterhaltung von Sitzungen über mehrere Server betrifft.An diesem Punkt wäre es besser, PHP auf vom Benutzer verwaltete Sitzungen umzustellen, bei denen es Ihre bereitgestellten Funktionen aufruft, um die Sitzungsdaten zu CRUDen (erstellen, lesen, aktualisieren, löschen).An diesem Punkt könnten Sie die Sitzungsinformationen in einer Datenbank oder einer Memcache-ähnlichen Lösung speichern, sodass alle Anwendungsserver Zugriff auf die Daten haben.

Das Speichern Ihrer eigenen Sitzungen kann auch von Vorteil sein, wenn Sie sich auf einem gemeinsam genutzten Server befinden, da Sie diese dann in der Datenbank speichern können, über die Sie oft mehr Kontrolle haben als über das Dateisystem.

Ich habe meine Sitzungen so aufgebaut:

auf der Anmeldeseite:

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

(Auf einer Konfigurationsseite definierter Satz)

dann in der Kopfzeile, die sich über den Rest der Website erstreckt:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache Header hinzufügen:

X-XSS-Protection    1

Ich würde sowohl IP als auch User Agent überprüfen, um zu sehen, ob sie sich ändern

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}

Wenn Sie es verwenden session_set_save_handler() Sie können Ihren eigenen Sitzungshandler festlegen.Beispielsweise könnten Sie Ihre Sitzungen in der Datenbank speichern.Beispiele für einen Datenbanksitzungshandler finden Sie in den php.net-Kommentaren.

DB-Sitzungen eignen sich auch, wenn Sie über mehrere Server verfügen. Andernfalls müssen Sie bei dateibasierten Sitzungen sicherstellen, dass jeder Webserver Zugriff auf dasselbe Dateisystem hat, um die Sitzungen zu lesen/schreiben.

Sie müssen sicherstellen, dass die Sitzungsdaten sicher sind.Indem Sie sich Ihre php.ini ansehen oder phpinfo() verwenden, können Sie Ihre Sitzungseinstellungen finden._session.save_path_ sagt Ihnen, wo sie gespeichert werden.

Überprüfen Sie die Berechtigung des Ordners und seiner übergeordneten Ordner.Es sollte nicht öffentlich sein (/tmp) oder für andere Websites auf Ihrem gemeinsam genutzten Server zugänglich sein.

Vorausgesetzt, Sie möchten weiterhin die PHP-Sitzung verwenden, können Sie PHP so einstellen, dass es einen anderen Ordner verwendet, indem Sie _session.save_path_ ändern oder die Daten in der Datenbank speichern, indem Sie _session.save_handler_ ändern.

Möglicherweise können Sie _session.save_path_ in Ihrer php.ini (einige Anbieter erlauben dies) oder für Apache + mod_php in einer .htaccess-Datei im Stammordner Ihrer Site festlegen:php_value session.save_path "/home/example.com/html/session".Sie können es auch zur Laufzeit mit _session_save_path()_ festlegen.

Überprüfen Chris Shifletts Tutorial oder Zend_Session_SaveHandler_DbTable festzulegender und alternativer Sitzungshandler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top