2012-02-24 112 views
1

对不起,这个新手问题!我正在制作一个小网站,允许用户创建自己的帐户。这不是一个银行系统,而且有人不想破解它。也就是说,我试图让它合理安全,因为那里有很多无聊的脚本小子。PHP:用户登录会话和cookies

有人可以描述一个用户登录的基本工作流程,并有一个cookie设置可以让他们保持登录状态30天吗?

此刻,我有以下几点:

  1. 验证和消毒输入的数据。
  2. 检查提供的证书是否针对数据库中的bcrypt散列密码。
  3. 如果正确,则调用“登录”功能。
  4. 登录功能:

    a。使用userID(具有两列的表格:SessionString和UserID)从数据库中删除任何会话数据。 b。将新会话数据添加到数据库(newy random generated string和UserID)。
    c。将随机生成的字符串和UserID写入cookie。 d。设置$_SESSION("UserID")$userID

不过,尽管两个cookie被创建并写入,该$_SESSION("UserID")保持空白......我猜,因为我不能给$_SESSION写任何时候我喜欢?

即使修复一次,我如何使用存储在cookie中的数据来登录用户?我猜我不想在每一页上加载数据库。它仍然需要我创建一个数据库对象来查看cookie中的凭证是否正常。这是正确的方式吗?

再次,为新手问题道歉!


UPDATE:
是的,我明白$_SESSION变量和饼干之间的区别。我在每页的顶部也有session_start()(在<php之后没有空行)。 $_SESSION("UserID")只是空白。

下面是从页面顶部的代码:

<?php 
session_start(); 

if(!isset($_SESSION['initiated'])) { 
    session_regenerate_id(); 
    $_SESSION['initiated'] = true; 
} 

感谢您的帮助。

+0

我不确定你是否已经完成了这个..但是你完成了setcookie吗?如果是,则使用$ _COOKIE您可以访问信息并执行登录部分。在做setcookie的时候,你可以设置过期到30天。 – dee 2012-02-24 16:33:41

回答

1

首先,有一个会话和饼干之间的重要区别。当您使用$_SESSION[".."]时,即使浏览器使用cookie来跟踪会话ID,您正在创建会话(位于服务器上,与客户端上的cookie相比)。要创建一个cookie,您可以使用setcookie()方法。

也就是说,我建议您阅读this article,这是一个关于如何创建安全登录脚本的分步指南,以及使用Cookie记录“记住我”特征的持久性。详细描述如何做到这一点将是广泛的一个SO回答害怕。

旁注:

为了能够写入会话,你可能会要求session_start();获取或设置使用$_SESSION[".."]会话变量之前。

+0

我已更新我的原始问题。我已经在顶部有'session_start()',但由于某些原因某些会话变量没有被设置。哎呀。 – 2012-02-24 17:16:20

+0

@DjangoReinhardt由于我们在问题中看不到那部分代码,所以它有点难以解决,但是如果某些会话变量被设置而其他会话变量不被设置,我的第一个猜测就是您拼错会话变量名称因为变量名是区分大小写的,所以'UserID'就在某处,比如'userId'或'UserId'或类似的东西。 – 2012-02-24 17:21:03

+0

是的,这是一个奇怪的,但它在代码的不同部分。我会继续挖掘。谢谢你的帮助。 – 2012-02-24 17:30:07

1

您是否编写了一个自定义会话处理程序,将会话文件存储在数据库中?我想你不会。

如果你想使用$_SESSION你还必须做session_start()。在使用PHP会话时,将为您设置识别用户的Cookie。您还将获得在/ tmp目录中创建的会话文件。这就是你的变量的位置和你分配给$_SESSION的任何东西都将被存储。

除非您定义自定义会话处理程序,它将管理会话文件的位置,否则不需要查询数据库。只需将用户凭证保存在$_SESSION

See this Tutorial on how to use PHP sessions.

PS:你访问数组是这样的:$_SESSION["UserID"],不与()

1

你可能想看看这篇文章,我已经讨论了各种类型的会话劫持以及如何避免它。

session security in php