2017-08-30 33 views
0

为我定制的框架我让用户如下登录并设置会话:如何进行安全会话?

<?PHP 
session_start(); 

// bunch of code 

if (isset($_SESSION['id') { 
    // check time and regenerate session id every 10 minutes 
    // session_regenerate_id(true); 
} 

// some more code 

if (isset($_POST['login']) { 
    // check if login is valid, when it is: 
    $_SESSION['user_id']  = getUserData('id'); 
    $_SESSION['user_name']  = getUserData('name'); 
    $_SESSION['user_is_admin'] = getUserData('admin'); // filled with 0 or 1 
} 

一切都存储在与BCRYPT散列密码的数据库。在此之上,我强制使用SSL,因此用户无法通过普通的http访问网站。

此方法是否安全? 如果不是;有什么安全缺陷,我可以做些什么来提高安全性?

+2

$ _SESSION ['id']与会话ID不同。 –

+0

可能最适合代码审查或安全交换 –

+0

首先定义“安全”。 – ADyson

回答

0

最好的办法是始终在登录屏幕上登录并立即登录强制使用随机数生成的新会话ID

session_start(); 
$newsessid = somerandomnumberfunction(); 
session_id($newsessid); 

你也可以用session_regenerate_id()函数生成一个新的ID

session_start(); 
session_regenerate_id(); 

而且它总是好的,以确保每一个有效的会话针对IP进行检查。一种好的方法是将会话ID和远程IP信息存储在一个表中,或者一旦用户登录并更好地将IP存储为会话变量本身,并确保为了安全而继续保留这些信息。当用户使用同一个办公室或共享网络时,这个课程不会工作,因为对外部世界的IP是相同的。

HTTPS始终是敏感的部位是个好主意,但保持它的持续性对于使用会话的所有页面是非常重要的,如果你真的想要一个简单的系统,否则任何人都可以随时嗅出你的数据包。

P.S根据我所知,您的方法是安全的。

一些提示:

  • 确保你总是使用全新的自我生成的会话ID在 成功登录尝试。
  • 尝试设置session.use_only_cookies = 1并检查是否所有的工作 罚款。
  • 在整个过程中始终使用https以确保没有人能够嗅探到您的会话 id。
  • 存储会话ID,远程IP信息,并比较连续 页
  • /etc/php5/apache2/php.ini文件
+0

存储远程IP是可以的,但是如果用户位于代理之后(即移动设备上的很多用户是)他们的知识产权可能会在会议期间发生变化,这会将他们赶出去还说你在办公室的便携式计算机上登录了网站,回家后又回到该网站,你将被迫再次登录。 –

+0

@MattRink然后我认为最好的方法是使用cookie。它将允许从任意媒体上的任意IP连接 - 在这一点上。 –

+0

@AsfandyarKhan感谢您的回答,为什么我应该使用wel生成的会话ID而不是session_regenerate_id()? – Harrie

1

首先设定session.use_trans_sid = 0,获取会话ID你应该使用session_id()$_SESSION['id']会抛出一个未定义的抵消异常,除非你把某些东西放在该值以下。

您不应使用会话ID来评估用户是否已通过身份验证,因为该值始终会评估为TRUE。会话ID将始终存在于您开始会话时,您应该在成功验证后将您的用户存储在会话中,例如$_SESSION['auth_user'] = get_user_from_db(),然后用它来评估用户是否被认证:

if (isset($_SESSION['auth_user'])) { 
    // Your logic 
} 

this post进行身份验证的最佳实践。

简而言之,您的会话cookie应该只能通过http访问,您应该像您那样只强制使用安全cookie。每当用户获得特权时(例如成功验证后),您应该重新生成会话ID。

您需要执行CSRF保护机制。

您应该实施登录限制(用户在特定时间段内失败登录尝试次数超过一次(例如1分钟后),以防止暴力攻击。