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!
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!
Antworten:
Es gibt einige Dinge zu tun, um Ihre Sitzung sicher zu halten:
$_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).Eine Richtlinie besteht darin, session_regenerate_id jedes Mal aufzurufen, wenn sich die Sicherheitsstufe einer Sitzung ändert. Dies hilft, Sitzungsentführungen zu verhindern.
Meine zwei (oder mehr) Cent:
Zu diesem Thema gibt es ein kleines, aber gutes Buch: Essential PHP Security 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
Ich denke, eines der Hauptprobleme (das in PHP 6 angesprochen wird) ist register_globals. Derzeit ist eine der Standardmethoden zur Vermeidung register_globals
die Verwendung von $_REQUEST
, $_GET
oder$_POST
Arrays.
Der "richtige" Weg, dies zu tun (ab 5.2, obwohl es dort ein wenig fehlerhaft ist, aber ab 6 stabil, was bald kommt), sind 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 Dokument zur Sitzungsfixierung enthält sehr gute Hinweise, wo Angriffe auftreten können. Siehe auch Seite zur Sitzungsfixierung bei Wikipedia .
Die Verwendung einer IP-Adresse ist meiner Erfahrung nach nicht die beste Idee. Beispielsweise; Mein Büro hat zwei IP-Adressen, die je nach Auslastung verwendet werden, und wir haben ständig Probleme mit der Verwendung von IP-Adressen.
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.
Dies ist ziemlich trivial und offensichtlich, aber stellen Sie sicher, dass session_destroy nach 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 ein gutes Tutorial zu setTimer () und clearTimer ().
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 Planung 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 die bereitgestellten Funktionen in CRUD aufgerufen werden (Erstellen, Lesen, Aktualisieren, Löschen) der Sitzungsdaten. 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.
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 auf 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();
}
session.cookie_httponly = 1
change session name from default PHPSESSID
X-XSS-Protection 1
X-XSS-Protection
nicht wirklich nützlich ist. Tatsächlich könnte der Schutzalgorithmus selbst tatsächlich ausgenutzt werden, was ihn schlimmer macht als zuvor.
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?
}
Wenn Sie session_set_save_handler () verwenden , können Sie Ihren eigenen Session-Handler 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.
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.
Überprüfen Sie das Tutorial von Chris Shiflett oder Zend_Session_SaveHandler_DbTable, um einen alternativen Sitzungshandler festzulegen .