Sitzungen sind wesentlich sicherer als z. B. Cookies. Aber es ist immer noch möglich, eine Sitzung zu stehlen, und der Hacker hat dann vollen Zugriff auf alles, was sich in dieser Sitzung befindet. Einige Möglichkeiten, dies zu vermeiden, sind die IP-Prüfung (die zwar recht gut funktioniert, aber nur eine sehr geringe Sicherheit bietet und daher allein nicht zuverlässig ist) und die Verwendung eines Nonce. Bei einem Nonce gibt es in der Regel einen "Token" pro Seite, so dass jede Seite prüft, ob das Nonce der letzten Seite mit dem gespeicherten übereinstimmt.
Bei beiden Sicherheitsüberprüfungen kommt es zu einem Verlust an Benutzerfreundlichkeit. Wenn Sie eine IP-Prüfung durchführen und der Benutzer sich hinter einer Intranet-Firewall (oder einer anderen Situation, die dies verursacht) befindet, die keine feste IP für diesen Benutzer speichert, muss er sich jedes Mal neu authentifizieren, wenn er seine IP verliert. Mit einer Nonce erhält man die immer wieder lustige Situation "Wenn man zurückklickt, bricht diese Seite ab".
Aber mit einem Cookie kann ein Hacker die Sitzung einfach stehlen, indem er recht einfache XSS-Techniken anwendet. Wenn Sie die Sitzungs-ID des Benutzers in einem Cookie speichern, ist er auch dafür anfällig. Auch wenn die Sitzung also nur von jemandem durchdrungen werden kann, der einen Hack auf Serverebene durchführen kann (wofür wesentlich ausgefeiltere Methoden und in der Regel ein gewisses Maß an Privilegien erforderlich sind, wenn Ihr Server sicher ist), benötigen Sie dennoch bei jeder Skriptanforderung eine zusätzliche Verifizierung. Sie sollten Cookies und AJAX nicht zusammen verwenden, da dies es ein wenig einfacher macht, sich völlig auszutoben, wenn das Cookie gestohlen wird, da Ihre AJAX-Anfragen möglicherweise nicht bei jeder Anfrage einer Sicherheitsüberprüfung unterzogen werden. Wenn die Seite beispielsweise eine Nonce verwendet, aber nie neu geladen wird, prüft das Skript möglicherweise nur auf diese Übereinstimmung. Und wenn das Cookie die Authentifizierungsmethode enthält, kann ich nun mit dem gestohlenen Cookie und dem AJAX-Loch mein Unwesen treiben.