2011-08-24 132 views
2

我想为我的用户验证会话添加更多的安全性。当用户登录我regenerate_session_id但我想你的答案如果我regenerate_session_id每个页面上,我认证的用户将帮助我。每一页我应该在每个网页上重新生成_session_id吗?

<?php 
    session_start(); 

    if(!isset($_SESSION['MEMBER_ID']) || (trim($_SESSION['MEMBER_ID']) == '')) { 
     header("location: denied.php"); 
     exit(); 
    } 
?> 

认证用户,我改变这

session_start(); 

if(!isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) { 
    header("location: access-denied.php"); 
    exit(); 
} else { 

session_regenerate_id(); } 

回答

6

您可以使用session_regenerate_id来防止会话固定攻击,其中攻击者获知给定用户的会话ID,然后“劫持”该会话ID以代替用户。

但是,必须小心。首先,你必须考虑异步请求。如果您有很多来自用户的并发请求,那么您需要避免出现另一种脚本在另一个尝试重新生成时使用会话数据的情况 - 一个脚本正在使用另一个脚本试图销毁的数据。

此外,这确实会增加开销。重新生成每个请求可能是一个矫枉过正的问题。相反,请尝试保留请求计数器;每10次请求(或任意选择)重新生成ID。

一定要将参数作为true传递 - 您不希望或需要围绕旧的会话数据(记住,仍然是并发请求)。有关更多信息,请参阅(docs)。所有这些 - 这种机制是一种“微增强”,它会给你比实际安全更多的虚假安全感。会话修复攻击并不常见,特别是如果您已经采取其他措施来加强安全性。例如,没有什么可以替代使用HTTPS进行安全连接;没有什么可以取代密码复杂性要求

2

可能使事情变得更加安全,但同时也引入了问题(例如,在用户打开时,在他的浏览器中有多个页面/页面的窗口并且在他们的浏览器上并行浏览)。在我看来,最好在会话中使用cookies。不过,无论如何,您可以使用session_regenerate_id(),因为它也可以用于cookie。

另外,您还应该检查用户是否是仍然允许访问该页面。他/她可能已被禁止,但按照您目前的设置,他/她仍然可以访问您的页面。

相关问题