PHP-Sitzungssicherheit

Translate

Was sind einige Richtlinien zur Aufrechterhaltung einer verantwortungsvollen Sitzungssicherheit mit PHP? Es gibt Informationen im ganzen Web und es ist an der Zeit, dass alles an einem Ort landet!

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Es gibt einige Dinge zu tun, um Ihre Sitzung sicher zu halten:

  1. Verwenden Sie SSL, wenn Sie Benutzer authentifizieren oder vertrauliche Vorgänge ausführen.
  2. Generieren Sie die Sitzungs-ID neu, wenn sich die Sicherheitsstufe ändert (z. B. Anmelden). Sie können sogar die Sitzungs-ID bei jeder Anforderung neu generieren, wenn Sie dies wünschen.
  3. Haben Sie eine Auszeit für die Sitzungen
  4. Verwenden Sie keine Registerglobale
  5. Speichern Sie die Authentifizierungsdetails auf dem Server. Senden Sie also keine Details wie den Benutzernamen im Cookie.
  6. Überprüf den$_SERVER['HTTP_USER_AGENT']. Dies fügt der Sitzungsentführung eine kleine Barriere hinzu. 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 bei 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 die benutzerdefinierte Sitzungsbehandlung
  8. Bei vertraulichen Vorgängen müssen angemeldete Benutzer ihre Authentifizierungsdetails erneut angeben
Quelle
Translate

Eine Richtlinie ist anzurufensession_regenerate_idJedes Mal, wenn sich die Sicherheitsstufe einer Sitzung ändert. Dies hilft, Sitzungsentführungen zu verhindern.

Quelle
Translate

Meine zwei (oder mehr) Cent:

  • Traue niemandem
  • Filtereingabe, Escape-Ausgabe (Cookie, Sitzungsdaten sind auch Ihre Eingabe)
  • Vermeiden Sie XSS (halten Sie Ihren HTML-Code gut, schauen Sie sich das anPHPTALoderHTMLPurifier)
  • Verteidigung in der Tiefe
  • Stellen Sie keine Daten zur Verfügung

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 Homepage des Buches finden Sie einige interessante Codebeispiele und Beispielkapitel.

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

Quelle
Translate

Ich denke, eines der Hauptprobleme (das in PHP 6 angesprochen wird) ist register_globals. Im Moment eine der Standardmethoden zur Vermeidungregister_globalsist die zu verwenden$_REQUEST, $_GEToder$_POSTArrays.

Der "richtige" Weg, dies zu tun (ab 5.2, obwohl es dort ein wenig fehlerhaft ist, aber ab 6 stabil, was bald kommt), ist durchFilter.

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');
Quelle
Translate

Dieses Sitzungsfixierungspapierhat sehr gute Hinweise, wo ein Angriff kommen kann. Siehe auchSitzungsfixierungsseite bei Wikipedia.

Quelle
Translate

Die Verwendung einer IP-Adresse ist meiner Erfahrung nach nicht 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. Dies war sehr hilfreich bei phpBB vor 3.0 (sie haben dies inzwischen behoben), aber ich denke, es ist immer noch eine gute Idee.

Quelle
Translate

Dies ist ziemlich trivial und offensichtlich, aber seien Sie sichersession_destroynach jedem Gebrauch. Dies kann schwierig zu implementieren sein, wenn sich der Benutzer nicht explizit abmeldet, sodass ein Timer dafür eingestellt werden kann.

Hier ist eine guteLernprogrammauf setTimer () und clearTimer ().

Quelle
Translate

Das Hauptproblem bei PHP-Sitzungen und der Sicherheit (neben dem Hijacking von Sitzungen) 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 Überlegungen oder Planungen ist dies ein weltweit lesbares Verzeichnis, sodass alle Ihre Sitzungsinformationen für jeden zugänglich sind, der Zugriff auf den Server hat.

Zum Verwalten von Sitzungen über mehrere Server. An diesem Punkt ist es besser, PHP auf vom Benutzer behandelte Sitzungen umzustellen, in denen Ihre bereitgestellten Funktionen an CRUD (Erstellen, Lesen, Aktualisieren, Löschen) der Sitzungsdaten aufgerufen werden. Zu diesem Zeitpunkt können Sie die Sitzungsinformationen in einer Datenbank oder einer memcacheähnlichen Lösung speichern, sodass alle Anwendungsserver Zugriff auf die Daten haben.

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

Quelle
Translate

Ich richte meine Sitzungen so ein:

auf der Anmeldeseite:

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

(Ausdruck auf einer Konfigurationsseite definiert)

dann in der Kopfzeile, die sich im Rest der Site befindet:

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

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache Header hinzufügen:

X-XSS-Protection    1
Quelle
Translate

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

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

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

DB-Sitzungen sind auch gut, wenn Sie mehrere Server haben. Wenn Sie andernfalls dateibasierte Sitzungen verwenden, müssen Sie sicherstellen, dass jeder Webserver Zugriff auf dasselbe Dateisystem hat, um die Sitzungen zu lesen / schreiben.

Quelle
Translate

Sie müssen sicherstellen, dass die Sitzungsdaten sicher sind. Wenn Sie sich Ihre php.ini ansehen oder phpinfo () verwenden, finden Sie Ihre Sitzungseinstellungen. _session.save_path_ gibt an, wo sie gespeichert sind.

Überprüfen Sie die Berechtigung des Ordners und seiner Eltern. Es sollte nicht öffentlich (/ tmp) sein oder von anderen Websites auf Ihrem freigegebenen Server zugänglich sein.

Angenommen, Sie möchten weiterhin eine PHP-Sitzung verwenden, können Sie PHP so einstellen, dass ein anderer Ordner verwendet wird, 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 in Ihrem Site-Stammordner festlegen:php_value session.save_path "/home/example.com/html/session". Sie können es auch zur Laufzeit mit _session_save_path () _ festlegen.

PrüfenChris Shifletts TutorialoderZend_Session_SaveHandler_DbTablezu setzen und alternativen Session-Handler.

Quelle