2011-08-03 42 views
3

我正在用PHP开发一个Web应用程序,用户可以拥有自己的帐户,并且跟踪用户的会话存储在MySQL数据库中。现在,在搜索关于如何实现这个的答案之后,我发现许多人都喜欢使用session_destroy()并取消设置cookie。为什么 - 会不会session_destroy()就足够了?即使the PHP manual说“为了完全杀掉会话,就像登录用户一样,会话ID也必须未被设置。”在从PHP会话注销期间取消设置Cookie的要点是什么?

我的推理:在用户注销并恰好在离开之前再访问您网站上的另一个页面后,PHP脚本检查用户是否登录会调用session_start(),设置新会话无论如何都是用户的cookie。下面是它看起来像:当然

// here we include some scripts and make some instances we'll need 
require_once("database.php"); 
require_once("session.php"); 
$database_connection = new DB_Connection(); 
$session = new Session($database_connection); 

// here a session cookie is sent to a user, even if he or she isn't logged in 
session_start(); 

// finally we check if the user is logged in 
$log_isLogged = false; 
if(isset($_SESSION['member_id'], $_SESSION['username'])){ 
    $log_member_id = $_SESSION['member_id']; 
    $log_username = $_SESSION['username']; 
    $log_isLogged = true; 
} 

,它是当用户知道这个事实,并离开现场前,一个新的cookie可以被设置好的。但是有些网站甚至会在注销后直接将您重定向到新页面,导致创建新的会话cookie - 取消您刚才的操作。

我的推理是否存在某些方面的缺陷,或者,如果您没有设置会话cookie,它是否无关紧要? 也许大多数开发人员只是认为它至少不能伤害它来解决它?

我不是母语的人,所以我提前为任何错误和语法错误表示歉意。

回答

6

(命名不明)session_destroy()函数只会将会话中的数据删除。它不会而不是从浏览器中删除会话cookie并保留与会话关联的session_id。 session_start()只有在客户端的请求中没有提供session_id时才会向客户端发出新的session_id。您的代码容易受到session fixation攻击,在这种攻击中,恶意攻击者将在您的站点上开始会话以获取有效的session_id,然后诱骗您的站点的毫无防备的用户使用攻击者已知的session_id登录。这可以通过向URL发送受害者与session_id的链接(如果你的网站会以这种方式接受)或其他各种方法来完成。一旦受害者登录,攻击者也会以同样的用户身份登录。

为了防止你应该会话固定攻击:

  1. 成功登录后,发出了一个全新的session_id到客户端通过调用session_regenerate_id()

  2. 在注销时,完全销毁服务器和客户端上会话的每个工件。这意味着拨打session_destroy()setcookie()取消设置客户端Cookie。

  3. 确保您的网站不会公开URL中的session_id或接受URL中提供的session_id。

  4. 请确保您的session_id长且足够随机,以至于实际上不会被攻击者猜出。

  5. 确保您的网站不容易受到cross site scripting攻击,这将允许攻击者从已登录的用户中窃取有效的session_id。

  6. 确保您的登录通过https进行,会话cookie被标记为安全。与会话相关的所有通信都应通过https进行。客户端的session_id绝不能通过http发送,因为这会在传输过程中暴露它。

更多参考:OWASP Top Ten page on session management

+0

好吧,谢谢你,我会考虑这样做 - 你知道我怎么会去阻止这种情况的发生?也许可以在每个网页浏览中更改SID,或者至少在登录后直接更改SID? – Muuse

+0

我明白1,3,4和5.现在读完他们后,他们似乎很明显。但是,我仍然不明白cookie的设置会有多大的不同,只要所有的数据在服务器端被删除。我的意思是,当不取消cookie设置时,由于session_destroy(),所有数据在服务器端仍然会被销毁。用户在浏览器中会留下一个SID作为cookie,当然,但是服务器无法识别的是登录的。这有什么害处?我会看看你提供给我的链接。非常感谢!! – Muuse

+0

@laph:认为#2是买二手手机。即使您使用自己的SIM卡,手机的IMEI也会保持不变,并且您的手机流量可以被知道IMEI的人员(例如向您出售手机的人员)捕获。为了保证您的会话不会被劫持,您必须更改与会话相关的所有事件,包括其ID。 –