note 87608 added to session.security
| From: | AnuragJain at osu1 dot php dot net | Date: | Fri, 12 Dec 2008 17:28:04 +0000 |
| Subject: | note 87608 added to session.security | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-148087@lists.php.net to get a copy of this message | ||
Websites which have sensitive information need to be patched to ensure its not exploited because of
session issues.
In earlier versions of apache cookie reliability was not assumed and hence the default method was
always using url-rewrite which meant every url link, every form submission etc would have a
PHPSESSID=<sessionid> passed along to inform the server about the active session. New versions
have turned this off using
session.use_trans_sid = 0
in the /etc/php5/apache2/php.ini file.
Reasons?
Well one might safe the offline page as a bookmark or pass the link across to others not realizing
that the session id information is also sent. So someone who quickly accesses these pages could
possible get logged on, this was also true wrt search engines, and I guess in some cases it being
seen as duplicate content as the same page will have a different session id every time the robots
scan the website.
But having this set does not mean you are protected. Let me explain.
What prevents me from presetting the session id! Assume there is a banking site www.example.com
which has a login screen at www.example.com/login.php
I can send you can email with a link to the bank site as http://www.example.com/login.php?PHPSESSID=12345
When you click on the link it presents the session id as 12345 rather then asking the server to
generate a new one. This is called session fixation. Keep in mind even with session.use_trans_sid =
0 this will work as this sets it only not to use url-rewrite. To prevent this altogether set
session.use_only_cookies = 1 which ensures that only cookies will be used, but this could cause
problems when dealing with transaction which involve switch sites, i.e. siteA forwards to site B for
payment which forwards to siteA for thank you, in which case a phpsessid inform might be used to
revive the old session.
A good approach would always be to at the login screen and immediately post login to force a new
session id generated using random numbers
session_start();
$newsessid = somerandomnumberfunction();
session_id($newsessid);
you can also use session_regenerate_id() function to generate a new id
session_start();
session_regenerate_id();
Also its always good to ensure every valid session is checked against an ip. One good method is to
store the session id and remote ip information in a table, or better store the ip as a session
variable itself, once the user logs in and ensure that this is continued for remaining pages for
security. This ofcourse wont work when users use the same office or shared network as the ip to the
outside world is the same.
https is always a good idea for sensitive sites, but keeping it persistent for all pages which use
session is important if you really want a foolproof system else anyone can always sniff your
packets.
So to quickly go through the bits
- set session.use_trans_sid = 0 in /etc/php5/apache2/php.ini file.
- Ensure you always use a new self generated session id on successful login attempt.
- Try setting session.use_only_cookies = 1 and check if all works fine.
- Use https throughout to ensure no one can sniff your session id.
- Store session id, remote IP information and compare for successive pages
----
Server IP: 130.206.1.5
Probable Submitter: 59.95.22.50
----
Manual Page -- http://www.php.net/manual/en/session.security.php
Edit -- https://master.php.net/note/edit/87608
Del: integrated -- https://master.php.net/note/delete/87608/integrated
Del: useless -- https://master.php.net/note/delete/87608/useless
Del: bad code -- https://master.php.net/note/delete/87608/bad+code
Del: spam -- https://master.php.net/note/delete/87608/spam
Del: non-english -- https://master.php.net/note/delete/87608/non-english
Del: in docs -- https://master.php.net/note/delete/87608/in+docs
Del: other reasons-- https://master.php.net/note/delete/87608
Reject -- https://master.php.net/note/reject/87608
Search -- https://master.php.net/manage/user-notes.php