5

我有一个典型的登录名(用户名、密码),还想包含一个“保存我的详细信息”复选框。登录表单将其值发布到 login_script.php,如果登录成功,用户将被重定向到站点的主页。

我想使用这种方法来保存登录详细信息

//Remember Me Function

if(isset($_POST['remember_me'])){

    // Set a cookie that expires in 24 hours
    setcookie("username",$username, time()+3600*24);
    setcookie("password",$password, time()+3600*24);

}

现在据我了解,setcookie("username",$username, time()+3600*24);必须在执行任何其他代码之前将其设置在 PHP 页面的顶部。

我的问题是,除非用户成功登录,否则我不想设置 cookie。但是,由于在登录测试后在脚本中间调用了设置 cookie 函数,因此它将不起作用。

有任何想法吗?干杯。

4

2 回答 2

8

首先:不要将密码保存在 cookie 中!从安全角度来看,这是一个非常糟糕的主意。

至于你的问题:没有办法解决它,你需要在设置cookie之前根本没有输出。有两种方法可以实现这一点:

解决方案 1:登录页面总是重定向

让您的登录请求转到设置 cookie 的脚本(如果登录成功),然后总是将用户重定向到另一个页面(例如欢迎屏幕,如果不成功,则返回登录页面)。登录脚本不会发出任何输出,因此您可以在重定向之前设置 cookie。

解决方案2:输出缓冲

在脚本开头开始输出缓冲。检查成功登录后,首先设置 cookie ,然后使用类似ob_end_flush.

就我个人而言,我认为解决方案 #1 更优雅,功能更优越。

于 2010-12-20T01:27:07.670 回答
3

将密码存储在用户可以访问的地方(在客户端)是一种非常糟糕的做法。更糟糕的是,您在存储密码时没有散列或加密密码(客户端可以看到密码!)

一个好的安全策略是绝不允许任何人看到实际密码。除非代码正在使用它。

你可以这样做:

  • 将密码存储在会话中
  • 延长会话到期时间

或者你可以改为

  • 散列并加密密码
  • 将登录信息存储到服务器上的文件中
  • 给文件一个唯一的名字
  • 将名称存储到 cookie
  • 每次您收到具有正确文件名的 cookie 时,查找该文件并检索登录信息。

但我总是推荐前者,因为它更容易实现并且会话处理由 PHP 完成(除非你覆盖了会话处理)

于 2010-12-20T01:25:41.650 回答