[Tickets #12136] Re: Session Timeout not enforced

noreply at bugs.horde.org noreply at bugs.horde.org
Wed May 1 21:18:05 UTC 2013


DO NOT REPLY TO THIS MESSAGE. THIS EMAIL ADDRESS IS NOT MONITORED.

Ticket URL: http://bugs.horde.org/ticket/12136
------------------------------------------------------------------------------
  Ticket             | 12136
  Updated By         | peter.meier+horde at immerda.ch
  Summary            | Session Timeout not enforced
  Queue              | Horde Framework Packages
  Version            | Git master
  Type               | Bug
  State              | Feedback
  Priority           | 2. Medium
  Milestone          |
  Patch              |
  Owners             |
------------------------------------------------------------------------------


peter.meier+horde at immerda.ch (2013-05-01 21:18) wrote:

So may I contribute my 2c here? To be honest I didn't look at the  
code, I'd ratjer like to formulate my expectations to how I would love  
to see  session expiry working.

Sidenote: For the time being it's irrelevant to me whether we  
distinguish between real-user activity or mailbox polling. I think  
this is a seperate issue. More on that later.

So I'd like to have horde this way:

1. cookie_timeout: When I close the browser the cookie should expire  
(means cookie_timeout should be 0). This means that when I'm using a  
normal browser that respects this setting I should not anymore be  
logged in, when I access the webmail the next time I start the  
browser. This is quite a crucial setting as it is the most efficient  
way to address forgotten logouts on shared computers. If I set  
cookie_timeout to something bigger thant 0, my cookie should live that  
long and also survive browser restarts and so on.

2. max_session_lifetime: This should be the maximum time I want users  
to be able to be logged in. Users are forced to log in again after  
that time. No matter how much activity happens within their session.  
Main reasons for that is to enforce users to run their login tasks.

3.  session_timeout: This should be the maximum time a session should  
live without any further requests. This means for example, if this is  
set to 30min. and I close my webmail tab (but not the whole browser)  
and try access webmail after 31 minutes again I need to log in again.

As I mentioned above for simplicity I do not want to distinguish  
currently between automated/background polls and real user  
interaction. This means that for point 3, if I leave my webmail tab  
open, I will be logged in also after 35 minutes. But still if I close  
my tab and so no polling happens I am logged out. Which is something  
that you, Michael, completely miss in comment #8.

Do we agree on these user stories or did I miss something, get  
something wrong?

Implementation brainstorming (as I said I have no idea how it is done  
currently):

Point 1 is a setting the timeout value of the cookie. That's not a big  
deal: copy setting value to cookie value.

Point 2: If I record the time the session got created and compare that  
value with max_session_lifetime each time I validate the session, I  
will perfectly know when I have to not accept the session anymore.

Point 3: If I record the time of the current request in the session  
and on the next request I check if that value is more than  
session_timeout ago and hence do not accept the session as valid, if  
it's beyond that time, I also have user story 3 implemented. Right?

So point 1 is unrelated to point 2 & 3 and hence an independent  
setting. Implementing point 2 means to store the creation time and  
compare it on each request. Point 3 is to store on each request the  
current time and compare the previous value to the current time. I  
don't expect this to be that expensive as I expect horde to write much  
more things on each request and session storage is usually something  
that should be written quickly.

The first answer in  
http://stackoverflow.com/questions/1236374/session-timeouts-in-php-best-practices provides an in my opinion a pretty good explanation how something like that should look like and why you can't count on gc_maxlifetime. The only thing in my opinion gc is for, is to garbage collect sessions that did not get closed by the user itself (read user logged out).  As mentioned before the gc probability can be quite low and so sessions can live much longer than expected. And well if longer would only be 5 minutes it would probably not be a that big issue, but if it's 2 to 3 times longer than what is set in session_timeout it's simply not working anymore as one would expect. Also there is no way to make that more controllable, it's purely  
random.

I didn't yet get why it should be a bad idea to write to the session  
on each request. The only thing I can think of is that the write  
operation is expensive. But I think horde is probably doing much more  
expensive operations during a request than updating a session. But I'm  
not an expert.





More information about the bugs mailing list