note 71256 deleted from features.cookies by salathe
| From: | salathe@php.net | Date: | Mon, 21 Sep 2020 14:34:38 +0000 |
| Subject: | note 71256 deleted from features.cookies by salathe | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-215202@lists.php.net to get a copy of this message | ||
Note Submitter: ingen at stocken.ws
----
If you want a secured session not tied to the client IP you can use the valid-for-one-query method
below, but to safeguard against a scenario where the legitimate user clicks twice, you can use a
shutdown function (register_shutdown_function)*.
It will check to see if the script terminated prematurely (connection_aborted), and reset the valid
session ID. That way, it's still valid when the user makes the second request. If the script
ends properly, the new session ID will be used instead.
Now, since you can't set a cookie from the shutdown function (after output has been sent), the
cookie should contain both the previous valid session ID and the new one. Then the server script
will determine (on the next request) which one to use.
:: Pseudo example:
::
:: [Start of script:]
::
:: 1. Get the session ID(s) from cookie
:: 2. If one of the session ID's is still valid (that is, if there's a storage associated
with it - in DB, file or whatever)
:: ____2.1. Open the session
:: 3. Generate a new session ID
:: 4. Save the new session ID with the one just used in cookie
:: 5. Register shutdown function
::
:: [End of script (shutdown function):]
::
:: 1. If script ended prematurely
:: ____1.1. Save session data using the old Session ID
:: 2. Else
:: ____2.1. Save session data using the new Session ID
:: ____2.2. Make sure the old session ID is added to a list of ID's (used for the purpose
described below)
:: ____2.3. Trash the old session storage
There's still the possibility of some deviant network sniffer catching the session cookie as
it's sent to the client, and using it before the client gets the chance to. Thus, successfully
hijacking the session.
If an old session ID is used, we must assume the session has been hijacked. Then the client could be
asked to input his/her password before data is sent back. Now, since we have to assume that only the
legitimate user has the password we won't send back any data until a password is sent from one
request.
And finally, (as a sidenote) we could obscure the login details (if the client has support for
javascript) by catching the form as it is sent, take the current timestamp and add it to the form in
a dynamically generated hidden form object, replace the password field with a new password that is
the MD5 (or similar) of the timestamp and the real password. On the serverside, the script will take
the timestamp, look at the user's real password and make the proper MD5. If they match, good,
if not, got him! (This will of course only work when we have a user with a session that's
previously logged in, since we know what password (s)he's supposed to have.) If the user
credentials are saved as md5(username+password), simply ask for both the username and password, md5
them and then md5 the timestamp and the user cred.
---
If you need a javascript for md5: http://pajhome.org.uk/crypt/md5/md5src.html
---
* You could use session_set_save_handler and make sure the session ID is generated in the open
function. I haven't done that so I can't make any comments on it yet.