I know this has been asked billions of times, but I'm super paranoid/OCD about the security of my coding. I'm working on a little project. The session data will only contain:
user_id 1
user_name MyUsername
logged_in true
csrf_token 87cc51ee94178df79cccce2aebc45d53
Here's my code. Is it secure enough to use on a small CMS?
session_start();
ini_set('session.cookie_httponly', 'On');
ini_set('session.cookie_secure', 'On');
ini_set('session.use_cookies', 'On');
ini_set('session.use_only_cookies', 'On');
$rand = rand(1, 10);
if ($rand != 1 || $rand != 3 || $rand != 5)
session_regenerate_id();
$user_ip = md5($_SERVER['REMOTE_ADDR']);
$user_agent = md5($_SERVER['HTTP_USER_AGENT']);
if (isset($_SESSION['user_ip'], $_SESSION['user_agent'])) {
$session_user_ip = $_SESSION['user_ip'];
$session_user_agent = $_SESSION['user_agent'];
if ($session_user_ip != $user_ip || $session_user_agent != $user_agent) {
unset($_SESSION);
session_destroy();
die('Error');
}
} else {
$_SESSION['user_ip'] = $user_ip;
$_SESSION['user_agent'] = $user_agent;
}
Then to call the sessions:
$_SESSION['user_id'] = 1;
$_SESSION['user_name'] = 'MyUsername'; // etc.
Extra Info
I'll be using the session data to check if user has permissions to do something. Example: if ( user_has_perm( $_SESSION['user_id'] ) )
Thanks for your help in advance.
Session security risks come from three different possibilities:
Prediction would mean that someone that's not the user for whom the session was created guessed their session ID. The chances of that happening are almost 0, although they do grow as more users use the site simultaneously.
With your code, you would make that risk even lower because it would only work if the attacker shared the user agent and the ip of the predicted session. But the difference is trivial in this case.
Fixation would mean that an attacker can create a session and then force another user into using their session. In this case it would depend: If the attacker knows that you are doing it and they fake the user agent and ip of the client, they could fixate the session. Or if they share ip and user agent.
And finally we have session hijacking, probably the most common method of the three. In this case an attacker would somehow gain access to the session id of a valid logged in user, and then use it to log in to their account. As with the previous method, this would only work for them if they know that you are checking the ip and user agent, and faked the same ones as the user. The technique you are using is not unique, and some attackers might fake them just in case.
That being said, is it secure? Yes and no
If you are obsessed with security, the answer is always the same: Use SSL
Unless your code is open source, almost anything you do that changes the behavior of the php sessions will be secure enough.
The only exception to that would be really popular sites that will attract the attention of hackers.
There is some very good documentation on this topic available: