2009-08-13 149 views
4

我发现这个问题#2的来源。它是利用了session_register(富)的。成立了以会话的登录系统,PHP

我把以下内容添加到我的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加载?

我的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; 
} 

该代码会生成持续的随机会话,从而不会为用户保存任何用户的数据。 我在我的代码$_SESSION更换登录/注册处理程序后每个$_REQUEST,因为$_REQUEST不包括$ _SESSION - 仍然是同样的问题,我无法看到用户名登记/登录后的首页。

回答

2

你的代码如下:session_regenerate_id之前

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

您definitly有一些输出(网页的全部内容,实际上)被调用;因此错误。

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

像调用session_start,以session_regenerate_id呼叫应在脚本的开始做,事情之前发送给浏览器。
所以,在这里,您的index.php的“顶部”的块。


编辑:更多的想法。

BTW?我不确定你真的需要拨打session_write_close;我可能从未使用过该功能,我相信......而且,引述商务部:

会话数据通常存储后 你的()脚本终止而不 需要调用session_write_close

唯一的情况下,你可能需要调用这个函数自己是如果你正在做久算了一笔账:

会话数据被锁定,以防止 并发写入只有一个脚本可能 随时在会话中操作。当 将帧集与会话 一起使用时,由于此锁定,您将逐个体验加载 的帧。您可以通过在会话 变量完成对会话的所有更改后尽快将会话结束为 来减少加载所有 帧所需的时间。

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

所以,你可以尝试删除(没用?)调用该函数...


而且,关于session_regenerate_id:你真的需要调用每一页上这个功能呢?

我想永远不会打电话给你的网站就足够了......即使你可能想在用户登录时调用它,但为了安全防范措施(如果我没有记错的话,很高兴每当调用此函数时用户的权限级别发生变化)

一样的session_id,btw:你真的需要在每个页面上调用这个函数吗?

+0

谢谢你解决第一个问题! – 2009-08-13 05:08:06

+0

不客气:-)我已经编辑了几个更多想法的答案;也许他们也会帮忙...... – 2009-08-13 05:53:54

+0

谢谢你对第二次更新的解释! - 我实施了改进建议。该网站连续不断地生成会话ID,以便用户的数据不会传输到下一页。 – 2009-08-13 13:44:25

3

您应该使用输出缓冲,以防止这种

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

一次正常输出发生无法发送头。

+0

PHP的一个很好的做法是不要在文件底部完成<?php标记。这将防止以这种方式产生无意的输出。 您看到的实际错误消息是由于您的头文件已被发送。在您已经将标题写出后,您无法在标题中发送新的Cookie(以更改session_id)。 – TheJacobTaylor 2009-08-13 04:41:14

+0

这就是说,在php文件的底部使用session_regenerate_id是一个小小的误导。 – TheJacobTaylor 2009-08-13 04:41:57

+3

也许这是一个强迫症,但我不能让一个标签不公开。我需要帮助吗? – 2009-08-13 04:47:23

1

session_regenerate_id - 与更新当前会话ID的新生成一个

如果你使用它,你现在的样子,你会一遍又一遍产生新的会话。

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

你每次设定一个新的会话与一个随机数。

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

+0

我实施了您的改进建议。我的网站不断重新生成会话ID,以便用户的数据不会传输到下一页。 – 2009-08-13 13:43:37

+0

我还没有看到您的评论。你还有问题吗? – 2009-08-26 01:31:03