2010-12-20 79 views
4

我有一个典型的登录名(用户名,密码),并且还想包含'保存我的详细信息'复选框。登录表单将其值发布到login_script.php,如果登录成功,用户将重定向到网站的主页面。设置cookie以保存登录详细信息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函数,它不起作用。

任何想法? 干杯。

+54

**请勿在COOKIES中储存密码** – zerkms 2010-12-20 01:20:05

+4

Nooooo!不要这样做 – 2010-12-20 01:20:38

+0

对密码的好评! +1 – Beaker 2010-12-20 01:22:11

回答

7

首先:不要保存密码在曲奇饼!这是一个非常糟糕的想法,安全明智。

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

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

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

解决方案2:输出缓冲

开始output buffering在脚本的开始。检查成功登录后,首先设置Cookie ,然后停止输出缓冲,如ob_end_flush

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

+0

也感谢您给我提供一些信息,而不仅仅是说“不要这样做”。我还有其他信息来存储其他信息,以便登录信息,以便为建议欢呼。 – 2010-12-20 01:38:22

2

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

一个好的安全策略绝不能让任何人看到实际的密码。除了代码正在使用它。

你可以这样做,而不是:

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

或者你可以改为

  • 哈希并加密密码
  • 存储l ogin信息保存到文件服务器
  • 上为文件的唯一名称
  • 商店名称每次收到正确的文件名的Cookie时间饼干
  • ,查找文件,并检索登录信息。

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

+5

“在会话中存储密码”---在会话中存储密码的任何理由?不是'user_id'足够吗? – zerkms 2010-12-20 01:28:13

+0

另外,如果您使用除文件系统,DBMS之外的任何持久存储,则第二种情况可能会更好。 – zerkms 2010-12-20 01:30:36

+0

非常感谢你在这件事上教育我,而不是诽谤我的问题。我对新的方面还很陌生。 – 2010-12-20 01:36:37