【问题标题】:Explanation for session_regenerate_id() proper usagesession_regenerate_id() 正确使用说明
【发布时间】:2013-12-09 06:05:53
【问题描述】:

我正在尝试学习会话和安全性,第一步似乎通过使用session_regenerate_id() 来加强会话,不幸的是,没有提供关于如何以及为什么我们应该首先使用它的好的文档地方。因此,我在 SO 中检查了一些类似 Using Session_regenerate_id() 的答案,它们实际上未能提供任何正确的用法以及它如何保护页面免受会话固定/劫持。

我总是使用这样的东西(对于简单的登录脚本,我知道 mysql 注入,这是示例)

if($_POST){
   $username = mysql_real_escape_string($_POST['username']);
   $password = mysql_real_escape_string($_POST['password']);
   $query = mysql_query("SELECT * 
                        FROM users
                        WHERE username = '$username'
                        AND password = '$password' ");
 $row = mysql_fetch_array($query); 

if($row){
   $_SESSION['LoggedIn'] = md5($username); 
}

现在,我使用此方法进行验证并授予登录用户访问权限

if(isset($_SESSION['LoggedIn']) && !empty($_SESSION['LoggedIn'])){
 //giv access to secured page
}else{
 //redirect to login page
}

所以,我的问题是session_regenerate_id() 如何帮助我加强会话以及如何正确使用它

【问题讨论】:

    标签: security session sessionid php


    【解决方案1】:

    重新生成 ID 可防止 session fixation,其中攻击者通过调整 cookie 中的会话 ID 将其他人的会话 ID 当作自己的。

    举例情况:

    1. 我在 Edward Snowden 吃午饭的时候用他的电脑访问 www.nsa.gov。
    2. 我注意到他的PHPSESSID cookie。
    3. 我等他登录超级安全系统。
    4. 我现在可以将我的 PHPSESSID 值设置为他的值并获得他的访问权限。

    在登录和提权时重新生成会话意味着我抓取的 ID 现在没用了。

    【讨论】:

    • 好的,但是你是在每次页面刷新时重新生成 id 还是什么?我的意思是,我的位置是在 session_start() 之后吗?如果是这样,它将在每个 HTTP 请求上生成。
    • 不必在每次刷新时重新生成。你可以,但如果你将会话存储在数据库或其他东西中,它可能会导致过多的开销。有些人每 10 次左右的网页浏览量就会随机重新生成一次。有些只是在初始登录时重新生成。这可能取决于您的系统需要有多安全。
    • 那么,我分配的会话和重新生成的会话 id 之间的联系是什么? ($_SESSION['loggedin'] = 'Ok'; $newId = session_regenerate_id()) 现在,$_SESSION['loggedin']$newId 之间有什么区别,它们不会冲突,相同值的新 ID 正在重新生成
    • 重新生成 ID 根本不会更改会话数据。它会更改浏览器中的 cookie,告诉 PHP 如何找到该数据,以便知道您旧 ID 的人无法获取它。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 2020-08-25
      相关资源
      最近更新 更多