题
我有一个典型的登录(用户名,密码),还希望包括一个“保存我的详细信息”复选框。登录表单将其值发布到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函数,因此它将行不通。
有任何想法吗?干杯。
解决方案
首先: 不要将密码保存在cookie中! 在安全方面,这是一个非常糟糕的主意。
至于您的问题:无法解决问题,在设置cookie之前,您根本不需要输出。有两种方法可以实现这一目标:
解决方案1:登录页面总是重定向
让您的登录请求转到设置cookie的脚本(如果登录成功),然后 总是 将用户重定向到另一页(例如欢迎屏幕,或者如果不成功,则返回登录页面)。登录脚本不会发出任何输出,因此您可以在重定向之前设置cookie。
解决方案2:输出缓冲
开始 输出缓冲 在脚本的开头。检查成功登录后,设置cookie 第一的 然后停止使用类似的输出缓冲 ob_end_flush
.
我个人认为解决方案#1的功能更加优雅和优越。
其他提示
将密码存储在用户可以访问的地方(在客户端)中是一种非常糟糕的做法。更糟糕的是,您在存储密码时没有哈希或加密密码(客户端可以看到密码!)!
良好的安全策略永远不会让任何人看到实际密码。除非代码正在使用它。
您可以做到这一点:
- 将密码存储在会话中
- 将会话扩展到更长的时间
或者你可以
- 哈希并加密密码
- 将登录信息存储到服务器上的文件
- 给文件一个唯一的名称
- 将名称存储到cookie
- 每当您收到具有正确文件名的cookie时,请查找文件并检索登录信息。
但是我总是建议前者,因为它更容易实施,并且会话处理是由PHP完成的(除非您要覆盖会话处理)