设置cookie以保存PHP的登录详细信息

时间:2010-12-20 01:18:58

标签: php login setcookie

我有一个典型的登录名(用户名,密码),还想包含一个“保存我的详细信息”复选框。登录表单将其值发布到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);

}

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

我的问题是我不想设置cookie,除非用户已成功登录。但是由于在登录测试后在脚本中间调用了set cookie函数,它将无法工作。

有什么想法吗? 欢呼声。

2 个答案:

答案 0 :(得分:8)

首先:不要在密码中保存密码!这是一个非常糟糕的安全概念。

至于你的问题:没有办法绕过它,在设置你的cookie之前你根本就没有输出。有两种方法可以实现这一目标:

解决方案1:登录页面始终重定向

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

解决方案2:输出缓冲

在脚本开头的output buffering处开始。检查成功登录后,首先设置cookie ,然后使用ob_end_flush之类的内容停止输出缓冲。

我个人认为解决方案#1在功能上更优雅,更优越。

答案 1 :(得分:3)

在用户可以访问的某个地方(在客户端)存储密码是一种非常糟糕的做法。更糟糕的是,您在存储密码时没有对密码进行哈希或加密(客户端可以看到密码!)

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

您可以这样做:

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

或者你可以改为

  • 哈希并加密密码
  • 将登录信息存储到服务器上的文件
  • 为文件指定一个唯一名称
  • 将名称存储到Cookie
  • 每次收到包含正确文件名的cookie时,请查找该文件并检索登录信息。

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