2016-12-18 92 views
1

我正在尝试确保用户在网站上的会话安全。 在登录流程中,我正在重新生成会话ID,以确保在会话固定方面更好的安全性(减少猜测的机会)。我正在尝试为session_regenerate_id()的工作测试一个脚本。它有两个实例。它们是:session_regenerate_id()如何在内部工作?

/var/www/public/goto/index.php:31:int 0 
/var/www/public/goto/index.php:32:string 'q96btv7i1ukpb3cq8tskcgdeb7' (length=26) 

在另一个选项卡(同一浏览器):
1)通过使用session_regenerate_id(真)

<?php 
session_start(); 
if (!isset($_SESSION['times'])) { 
    $_SESSION['times'] = 0; 
    $_SESSION['generate'] = true; 
} else { 
    if ($_SESSION['generate'] === true) { 
     session_regenerate_id(true); 
     $_SESSION['generate'] = false; 
    } 
    $_SESSION['times']++; 
} 
var_dump($_SESSION['times']); 
var_dump(session_id()); 
?> 

以下是我得到了它的输出删除旧的会话:

/var/www/public/goto/index.php:31:int 1 
/var/www/public/goto/index.php:32:string 'gspq91o1jbcrcc27b4fkm4qgd5' (length=26)

在打开另一个选项卡中的相同页面后检查文件夹时,会话fil ES存储,我发现只有与字符串相关的会议文件:gspq91o1jbcrcc27b4fkm4qgd5

2)刚再生新的会话ID使用session_regenerate_id()

<?php 
session_start(); 
if (!isset($_SESSION['times'])) { 
    $_SESSION['times'] = 0; 
    $_SESSION['generate'] = true; 
} else { 
    if ($_SESSION['generate'] === true) { 
     session_regenerate_id(); 
     $_SESSION['generate'] = false; 
    } 
    $_SESSION['times']++; 
} 
var_dump($_SESSION['times']); 
var_dump(session_id()); 
?> 

输出的第一个标签:

/var/www/public/goto/index.php:31:int 0 
/var/www/public/goto/index.php:32:string 'odu7sttll7pp43suqu22laa755' (length=26) 

输出第二个选项卡:

/var/www/public/goto/index.php:31:int 1 
/var/www/public/goto/index.php:32:string '27po8j6bu318fd3e69ug4m53i3' (length=26) 

在这种情况下,我发现关于该会话ID会话文件:odu7sttll7pp43suqu22laa75527po8j6bu318fd3e69ug4m53i3 因此,函数说的话,它的作用。 但是,我的问题来到这里(对不起长头介绍),在第一种情况下,当使用session_regenerate_id(true)时,第一个选项卡上的cookie包含旧会话ID,而新选项卡上的cookie包含新会话ID。 打开第二个选项卡后,当我刷新第一个选项卡时,我奇迹般地获得3作为输出,第二个选项卡session id。 这里我不明白的是,当我刷新Tab 1时,它发送给服务器的cookie包含旧的会话ID,该旧的会话ID不应再有效(并且不作为服务器上的文件存在),我如何获得3作为输出?
即使选项卡1不知道再生和新会话cookie,同一个会话仍然如何保持?
当我刷新标签页1 而不是的页面时,请不要请求新生成的会话(在标签2上)?
这将在同一个浏览器上进行两个会话,而实际上并不是这样。如何PHP处理这对session_regenerate_id(true)

请注意:以下是我的会话输出的phpinfo() php config

+1

浏览器处理cookie,当服务器生成一个新的会话ID时,服务器发回一个新的cookie,浏览器接受cookie(或不是,取决于浏览器的设置),当你发出新的请求时,浏览器发回新的cookie。 –

+1

此外,如果您使用缓存,则浏览器可以在缓存中使用其Cookie,而不是使用新的Cookie。重新生成会话时,尝试使用CTRL + R来刷新而不使用缓存。 – AnthonyB

+0

@AnthonyB有趣的一点。我从来没有遇到过使用缓存中的cookie的浏览器,但我会深入研究这一点。 –

回答

0

谢谢@Charlotte杜诺瓦和@AnthonyB帮了我。
这是我的错误。
Chrome Dev Tools似乎并未实时更新cookie信息。在检查设置上的所有网站数据后,我发现我的域只有一个与之关联的cookie,这是Tab 2的一个。
实际上,当我刷新Tab 1时它确实发送了新的cookie。可能有一个作为@AnthonyB说的例外(评论)。

在开发工具上,当我为Tab 1关闭它并为Tab 1重新打开它时,我发现Cookies选项卡具有更新的值。我再也看不到旧的cookie值。

发现后,即使Cookie信息发生变化,Chrome也不会对Cookie进行实时更新(就像它在页面元素,样式中一样)。
我认为这也不是必需的。
欢呼声给大家。