A priori, l'objet de session n'est pas accessible au client, car il est stocké sur le serveur web. Cependant, l'identifiant de session est stocké sous forme de cookie et permet au serveur web de suivre la session de l'utilisateur.
Pour empêcher le détournement de session à l'aide de l'identifiant de session, vous pouvez stocker une chaîne hachée à l'intérieur de l'objet de session, réalisée à l'aide d'une combinaison de deux attributs, remote addr et remote port, accessibles au serveur Web dans l'objet de requête. Ces attributs lient la session de l'utilisateur au navigateur dans lequel il s'est connecté.
Si l'utilisateur se connecte depuis un autre navigateur ou un mode incognito sur le même système, l'adresse IP restera la même, mais le port sera différent. Par conséquent, lors de l'accès à l'application, le serveur Web attribue à l'utilisateur un identifiant de session différent.
Voici le code que j'ai mis en place et testé en copiant l'identifiant de session d'une session à une autre. Il fonctionne assez bien. S'il y a une faille, faites-moi savoir comment vous l'avez simulée.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
String sessionKey = (String) session.getAttribute("sessionkey");
String remoteAddr = request.getRemoteAddr();
int remotePort = request.getRemotePort();
String sha256Hex = DigestUtils.sha256Hex(remoteAddr + remotePort);
if (sessionKey == null || sessionKey.isEmpty()) {
session.setAttribute("sessionkey", sha256Hex);
// save mapping to memory to track which user attempted
Application.userSessionMap.put(sha256Hex, remoteAddr + remotePort);
} else if (!sha256Hex.equals(sessionKey)) {
session.invalidate();
response.getWriter().append(Application.userSessionMap.get(sessionKey));
response.getWriter().append(" attempted to hijack session id ").append(request.getRequestedSessionId());
response.getWriter().append("of user ").append(Application.userSessionMap.get(sha256Hex));
return;
}
response.getWriter().append("Valid Session\n");
}
J'ai utilisé l'algorithme SHA-2 pour hacher la valeur en utilisant l'exemple donné à l'adresse suivante SHA-256 Hachage à baeldung
Nous attendons vos commentaires avec impatience.