it-swarm.com.de

Erstellen sicherer PHP Sessions

Ich habe bereits Registrierungs- und Anmeldesysteme erstellt und verfeinert. Ich bin jedoch der Meinung, dass der schwierige Teil beim Erstellen einer Sitzung auftritt. Soweit ich weiß, liegt dies sowohl an der Entführung als auch an der Fixierung. Was ich ehrlich gesagt nicht ganz verstehe.

Ich habe den ganzen Tag im Internet gesurft und viel recherchiert. Die folgenden Artikel waren bisher für mich nützlich:

So erstellen Sie kugelsichere Sitzungen

PHP-Sicherheitshandbuch: Sitzungen

Bisher habe ich sehr wenig, ich könnte wirklich Hilfe und Anleitung gebrauchen. Dies ist etwas von dem, was ich bisher habe:

Wenn ein Benutzerkennwort übereinstimmt und er seine Identität mithilfe des Anmeldeskripts bestätigt hat, wird die folgende Funktion aufgerufen. Die Sitzung wird oben im Anmeldeskript gestartet.

function begin_session()
{
session_regenerate_id();
$_SESSION['valid'] = 1;
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']);
} 

Ich verwende die Variable $ _SESSION ['valid'] als einfache Variable, bei der der Benutzer zur Bestätigung angemeldet ist. Ich weise die Sitzung einem einzelnen Benutzeragenten und einer einzelnen IP-Adresse zu. Ich sehe, dass der User Agent ziemlich nutzlos ist, da er leicht gefälscht werden kann, aber ich denke, es ist besser, ihn zu haben, als ihn nicht zu haben.

Es ist für mich offensichtlich, dass Benutzer mit sich ändernden/dynamischen IPs abgemeldet werden ... aber jeder, der mir dies gesagt hat, hat mir keine bessere Option angeboten oder es mir besser erklärt.

Ich verwende dann die folgende Funktion, um den aktuellen Benutzeragenten mit dem ursprünglichen Benutzeragenten abzugleichen, der bei der Erstellung der Sitzung protokolliert wurde.

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

Im Moment weiß ich aufgrund meines Unverständnisses nicht, woher ich verwundbar bin und wohin ich gehen und Verbesserungen vornehmen kann. Das ist alles sehr neu für mich und zumindest versuche ich im Moment, dies in meiner Freizeit zu lernen. Es ist alles neu für mich und ich möchte die beste Arbeit sicherstellen.

18
TuKritical

In erster Linie STOPPEN SIE DIE VERWENDUNG VON MD5! Es ist eine kaputte Hash-Funktion, die seit vielen Jahren kaputt ist. Außerdem müssen Sie einen hmac verwenden. Der direkte Aufruf von md5 ist anfällig für einen Längenerweiterungsangriff.

Das Testen der IP-Adresse ist problematisch, da sich dieser Wert ändern kann, wenn sich der Benutzer hinter einem Load Balancer befindet, der üblicherweise von Universen und Unternehmensbüros verwendet wird.

Der Angreifer hat immer den Benutzeragenten, und dieser Wert ist sehr leicht zu erzwingen. Das Testen dieses Wertes ist in keiner Weise eine "Sicherheitsmaßnahme". Es ist sehr ähnlich wie mit einer Variablen is_attacker=no und sicherstellen, dass dieser Wert "nein" ist, was EIN WITZ ist! Wenn ich einen Programmierer sehe, der dies tut, rieche ich Blut, wenn sie tatsächlich denken Dies hilft, die Sicherheit zu verbessern, wenn sie wahrscheinlich andere Fehler gemacht haben.

Stellen Sie Ihre PHP-Sitzungskonfigurationen wie folgt ein:

session.cookie_httponly = 1 (helps mitigate xss)
session.session.use_only_cookies = 1 (prevents session fixation)
session.entropy_file = "/dev/urandom" (better entropy source)
session.cookie_lifetime = 0  (smaller exploitation window for xss/csrf/clickjacking...)
session.cookie_secure = 1 (owasp a9 violations)
15
rook

Dies kann nur eine persönliche Meinung sein ...

Ich würde die Sitzungsinformationen in einer Datenbank speichern und sie durch ein in einem Cookie gespeichertes Token referenzieren. Sie benötigen die "gültige" Variable nicht mehr, da die Datenbank auf das Token verweisen und sicherstellen würde, dass es sich noch innerhalb der zulässigen Lebensdauer befindet.

Sie können wählen, ob Sie direkt mit dem Cookie arbeiten oder das Cookie verwenden möchten, um Sitzungsinformationen festzulegen, wenn Sie möchten. Sitzung ist nicht wirklich notwendig. Einfacher aber besser.

Ihr Token kann generiert werden, wenn sich der Benutzer anmeldet und bei Bedarf beim Laden einer Seite neu generiert wird - wenn Sie den Zyklus beibehalten möchten.

benutzeragent und Remote-Adresse sind keine gute Basis für ein Token, da sie für viele Menschen sehr häufig sein können. Denken Sie wie ein Stellvertreter für ein College oder so. Jeder wird die gleiche IP haben. Sie könnten jede zufällige Zeichenfolge erstellen und es würde ausreichen, solange es eindeutig ist.

Was auch immer Sie tun, die Grundidee ist, die Menge an Informationen in Ihrer Sitzung oder Ihren Cookies auf ein Minimum und so dunkel wie möglich zu halten. Es ist schwierig, ein gültiges Token zu erraten, wenn Sie den Ablauf auf eine normale Zeit einstellen. Außerdem können Sie fehlgeschlagene Versuche verfolgen und Versuche blockieren, die sich über einen kurzen Zeitraum häufen.

Sie können auch Personen booten, wenn ein Konto versucht, sich von mehreren Standorten aus anzumelden. In diesem Fall können Benutzeragent und IP helfen, gleichzeitige Zugriffsversuche zu identifizieren.

2
Kai Qing

Ich bin derzeit in einer ähnlichen Position und betrachte die verschiedenen Optionen und Auswirkungen der Sitzungssicherheit. Es ist eine ziemliche Herausforderung, Benutzerfreundlichkeit und Sicherheit mit potenziellen Schwachstellen auf dem Server, im Transport und auf dem Client in Einklang zu bringen. SSL ist der beste Weg, um die Transportschicht zu schützen, und eine sichere Einstellung von Cookies unterstützt den Clientschutz.

In Bezug auf die Verwendung der $ Server-Remote-Adresse gibt es Probleme. Für einige Benutzer ändert sich dieser Wert ziemlich regelmäßig und ein Benutzer, der sein Passwort jedes Mal neu eingeben muss, wird ärgerlich. Für andere Benutzer, die eine feste IP-Adresse oder einen festen IP-Adressbereich haben, kann dies dazu beitragen, das Knacken zu erschweren, insbesondere wenn auch SSL verwendet wird. Remote IP ist kein Wundermittel in Bezug auf Sicherheit, aber nichts befindet sich im Cyberraum. Die Kombination mehrerer Sicherheitsmethoden hilft. Der Versuch, ein Benutzerprofil zu erstellen, mit dem $ server-Variablen konstant bleiben und dessen Änderung hilfreich ist, um zu wissen, wann der Benutzer abgemeldet und das Kennwort zeitnaher und benutzerfreundlicher abgefragt werden muss. Wenn der Benutzer abgemeldet ist, muss jeder Brute-Force-Versuch mit den anderen $ server-Variablen wie Benutzeragent oder Sprachcodierung nur warten, bis sich der echte Benutzer wieder anmeldet.

Wie Sie mit mehreren Anmeldequellen umgehen, hat auch Probleme. Was ist, wenn der Benutzer von der Arbeit, zu Hause oder unterwegs einchecken möchte? Wenn Sie einige Informationen darüber haben, wie der Benutzer sein Konto in den ersten Tagen verwendet, können Sie wissen, wann Sie die Sitzung schließen und später erneut nach dem Kennwort fragen müssen. Als Administratoren und selbst bei perfekter Cybersicherheit wird die Verwaltung der Kennwörter durch die Benutzer weiterhin ein Problem sein und eine gewisse Einrichtung erfordern, um das Chaos zu beseitigen, wenn es passiert.

0
Kevin Martin