通过PHP中的Sessions设置登录系统

时间:2009-08-13 04:19:16

标签: php session login

我找到了问题#2的来源。它是使用 session_register(foo)

我将以下内容添加到 handle_registration.php

session_register("foo");
session_register("foo2");

$foo2 = $_POST['email'];
$foo['email'] = $_POST['email']

问题仍然存在,因为没有变量存储到我的会话cookie中。


这是我login script的逻辑。

  1. Pascal MartinThe Disintegrator解决: 将函数session_write_close放入生成会话以进行登录的正确位置是什么?
  2. 如何为用户“会话”获取永久会话,以便每次加载index.php时都不会启动新会话?
  3. 我的session_start()开头有index.php

    index.php的开头

     session_start();       
     if($_SESSION['logged_in'] == false) {
         $random_number = rand(1,100000);                                                       
         session_id($random_number);
         session_id['email'] = '';
     }
    

    而我的index.php的结尾

    <?php
    session_write_close();        // Session code ends here!
    ?>
    

    我在会话开始之后就用

    代码验证用户密码的验证过程
     $dbconn = pg_connect("host=localhost port=5432 dbname=masi user=masi password=123");
     $result = pg_prepare($dbconn, "query22", "SELECT passhash_md5 FROM users
             WHERE email=$1;");
    
     $passhash_md5 = pg_execute($dbconn, "query22", array($_REQUEST['email']));     
     // users from registration/login form
     if ($passhash_md5 == md5($_REQUEST['password'])) {
         $_SESSION['logged_in'] = true;
         $_SESSION['email'] = $_REQUEST['email'];
         $_SESSION['passhash_md5'] = md5($_REQUEST['password']);
     }
    
     // this may be unnecessary if the passhash_md5 cannot be changed by the user 
     $passhash_md5_2 = pg_execute($dbconn, "query22", array($_SESSION['email']));  
     // users staying in the site
     if ($passhash_md5_2 == $_SESSION['passhash_md5'])) {
         $_SESSION['logged_in'] = true;
     }  
    

    代码连续生成随机会话,以便不为用户保存用户的数据。 我在代码中用$_REQUEST替换了登录/注册处理程序后的每个$_SESSION,因为$_REQUEST不包含$ _SESSION - 仍然是同样的问题,我在主页后看不到用户名注册/登录。

4 个答案:

答案 0 :(得分:3)

您应该使用输出缓冲来防止此

<?php
ob_start();
everything here
ob_end_flush();
?>

正常输出发生后,您无法发送标头。

答案 1 :(得分:2)

您的代码如下所示:

                             -- content cut --
</html>
<?php
session_regenerate_id(true);               // Session code ends here!
session_write_close();
?>

在调用session_regenerate_id之前,你确实有一些输出(实际上是你页面的全部内容);因此错误。

问题不在于“空行”或空格:它是输出;并输出 HTML ; - )

与对session_start的调用一样,对session_regenerate_id的调用应该在脚本开头完成,然后才能向浏览器发送任何内容。
所以,在这里,在index.php的“顶部”的块中。


编辑:更多想法。

顺便说一句?我不确定你是否真的需要致电session_write_close;我可能从未使用过这个功能,我相信......而且,引用文档:

  

会话数据通常存储在之后   你的脚本终止没有   需要调用session_write_close()

您可能需要自己调用此函数的唯一情况是,如果您要进行长时间的计算:

  

会话数据被锁定以防止   并发写入只有一个脚本可能   随时进行会话。什么时候   使用框架集和会话   您将体验到框架加载   由于这种锁定一个接一个。您   可以减少加载所有时间   通过结束会话为框架   所有更改到会话   变量已经完成。

但这似乎不是你的情况,因为你在脚本的末尾调用它。

那么,您可以尝试删除对该函数的(无用?)调用...


而且,关于session_regenerate_id:你真的需要在每个页面上调用这个函数吗?

我想从来没有打过电话就足以让你的网站工作......即使你可能想在用户登录时调用它,也是为了安全预防措施(如果我没记错的话,那么无论什么时候调用这个函数都很好。用户的权限级别更改)

同样关于session_id,顺便说一下:你真的需要在每一页上调用这个函数吗?

答案 2 :(得分:1)

答案 3 :(得分:1)

session_regenerate_id - 使用新生成的

更新当前会话ID

如果你按照自己的方式使用它,你将一遍又一遍地产生新的会话。

session_id - 获取和/或设置当前会话ID

您每次都使用随机数设置新会话。

实际上,你唯一需要使用会话的是在脚本的开头放一个session_start()语句。