Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Session regenerate causes expired session with fast AJAX calls

My application is a full AJAX web page using Codeigniter Framework and memcached session handler.

Sometimes, it sends a lot of asynchronous calls and if session has to regenerate its ID (to avoid session fixation security issue), the session cookie is not renewed fast enough and some AJAX calls fail due to session id expired.

Here is a schematic picture I made to show clearly the problem : enter image description here

I walked across the similar threads (for example this one) but the answers doesn't really solve my problem, I can't disable the security as there is only AJAX calls in my application.

Nevertheless, I have an Idea and I would like an opinion before hacking into the Codeigniter session handler classes : The idea is to manage 2 simultaneous session Ids for a while, for example 30 seconds. This would be a maximum request execution time. Therefore, after session regeneration, the server would still accept the previous session ID, and switch to session to the new one. Using the same picture that would give something like this :

enter image description here

like image 776
Nicolas Thery Avatar asked Jul 14 '16 11:07

Nicolas Thery


People also ask

What happens to session cookie after a lot of AJAX calls?

Hi, well, when a lot a ajax calls is perfomed, an you still on page ( like a ajax chat) , session cookie in one of this calls expire and return a new CI cookie, cousing on next call a logout, becouse hash saved on db it's diferent of new cookie, its happaends around 5 mins with ajax calls.

How do I handle session timeouts with Ajax?

In one particular case a user’s session may have timed out before they made an Ajax call. This post describes one such way of handling this in a somewhat friendly way. The first step to handing session timeouts with AJAX is to handle them for non-Ajax requests first.

Why does show() generate a new session when I run it?

Since you run show () without passing the session id, APEX generates a new session for you. You probably do not need that code at all. tnx for your input.

What happens when you run show() without passing the session ID?

Since you run show () without passing the session id, APEX generates a new session for you. You probably do not need that code at all. tnx for your input. Our invalid session proc was an experiment with the idea that it could be changed in the future to do more than just what it does now, e.g. do some logging.


1 Answers

First of all, your proposed solution is quite reasonable. In fact, the people at OSWAP advise just that:

The web application can implement an additional renewal timeout after which the session ID is automatically renewed. (...) The previous session ID value would still be valid for some time, accommodating a safety interval, before the client is aware of the new ID and starts using it. At that time, when the client switches to the new ID inside the current session, the application invalidates the previous ID.

Unfortunately this cannot be implemented with PHP's standard session management (or I don't know how to do that). Nevertheless, implementing this behaviour in a custom session driver 1 should not pose any serious problem.

I am now going to make a bold statement: the whole idea of regenerating the session ID periodically, is broken. Now don't get me wrong, regenerating the session ID on login (or more accurately, as OSWAP put it, on "privilege level change") is indeed a very good defense against session fixation.

But regenerating session IDs regularly poses more problems than it solves: during the interval when the two sessions co-exist, they must be synchronised or else one runs the risk loosing information from the expiring session.

There are better (and easier) defenses against simple session theft: use SSL (HTTPS). Periodic session renewal should be regarded as the poor man's workaround to this attack vector.


1link to the standard PHP way

like image 165
RandomSeed Avatar answered Nov 15 '22 13:11

RandomSeed