登录系统:为什么需要会话?

时间:2010-07-30 16:32:08

标签: php authentication session sessionid

我正在用PHP创建一个登录系统,我想知道:为什么需要会话?

如果我使用userid存储cookie并且sessionid不存在,则存在与存储具有用户ID和密码哈希值的cookie完全相同的安全风险(假设密码哈希足够强)?是的,有人可能会窃取cookie,但如果他们窃取了sessionid cookie,那不是一样的吗?

有人能告诉我在每个(合理安全的)登录系统中使用会话的原因是什么?

6 个答案:

答案 0 :(得分:3)

会话的一个好处是,您可以在每次有人登录时生成新的,甚至在用户访问期间定期生成。如果您刚刚使用了userid和密码的哈希值,那么只要有人偷走了您的cookie,他们就可以无限期地登录。会话到期。

答案 1 :(得分:1)

为什么不加密会话ID,而不是创建哈希,这样你就可以解密它,看看它是否超时。

如果您还将其绑定到IP地址,那么您可以使其更安全。

或者,您可以让用户只需登录他们想要访问的每个页面。

一旦解决方案是拥有一个实际获取用户所有信息的javascript应用程序,那么,用户名/密码将存储在javascript中。然后,对于每个页面请求或交互,传递用户名/密码或作为某些初始身份验证结果的令牌,该令牌也按上述方式加密。

然后您不需要会话,如果用户关闭该选项卡,他们的信息就会消失,因此没有安全风险。

会话ID比使用javascript完成所有操作更简单,因此,大多数人选择会话,但是,您不必这样做。

答案 2 :(得分:1)

您描述了一种设计,其中在每个页面请求上验证用户凭据,并且登录表单仅用于在浏览器中存储这些凭据。我看到了这种不同寻常的方法存在的几个问题:

  • 您在每个 HTTP请求上传输敏感信息。
  • 为了验证凭据,您可能需要运行数据库查询,并且一次又一次地执行此操作。
  • 您必须验证凭据才能知道请求来自谁。
  • 使用相同凭据的同时连接将共享数据 [请参阅附录]

更典型的做法是验证用户一次(可能使用加密频道或散列信息)并在指定时间内记住它。

无论如何,会话和cookie是完全不同的工具。 Cookie是客户端存储,而会话是服务器端。它们只是相互关联,因为最典型的会话实现使用cookie来存储会话ID(因为HTTP是无状态协议,你需要这样的技巧来跟踪来自谁的请求)。服务器端存储的好处是你可以完全控制它:

  • 您可以根据需要使用尽可能多的空间。
  • 您可以使用您需要的任何数据格式。
  • 您可以保存敏感数据或您不希望用户看到或破坏的内容。
  • 您可以信任这些信息,因为将它放在那里。

附录

在会话启动时为随机ID分配的经典会话系统中,注册用户可以在不同的计算机中(或者甚至在单个计算机中同时具有多个会话实例,例如,一个在Firefox中,另外三个在Chrome隐身模式窗口中) )。如果你只用他的用户名来识别访问者,那么用户只会有一个会话:如果他回家吃午饭,他会找到他离开工作的会话,如果他与朋友分享他的密码,他会看到他的朋友是什么这样做。这可以被认为是一个错误或一个功能,当然,有很多技巧可以防止它。请考虑一下。

答案 3 :(得分:0)

您可以设置为立即过期的Cookie,或者如果您愿意,可以在一年后过期。 浏览器关闭后,会话会立即过期。 因此,它们通常更安全。 在这个特定场景中确实没有什么区别 - 除了到期时间长度,以及一个“物理”存储在客户端机器上而另一个存储在内存中的事实。

答案 4 :(得分:0)

因为更安全的时期。

对于会话,信息存储在服务器中,因此如果有人仍然需要任何类型的信息,则需要再执行几个步骤。使用cookie,任何人都可以直接从本地机器获取信息,而无需服务器请求。

答案 5 :(得分:0)

  

如果我使用userid存储cookie并且sessionid不存在,则存在与存储具有用户ID和密码哈希值的cookie完全相同的安全风险(假设密码哈希足够强)?是的,有人可能会窃取cookie,但如果他们窃取了sessionid cookie,那不是一样的吗?

是的,它可能存在类似的风险。由于以下几个原因,窃取cookie可能并不严重:

  • 会话Cookie的使用寿命更短。
  • 用户经常在站点之间回收用户名/密码,如果他们的凭据被拦截,这可能会使他们暴露更多。
  • 会话实际上可能不允许用户执行与用户名/密码相同的操作;例如,该网站可能要求用户在某个时候重新输入他的凭据。
  • 网站可能会将会话有效性限制为一个特定的IP。

但是,是的,会话cookie被盗可能在某些情况下与用户名/通行证被盗一样严重。要获得对被盗凭据的可靠保护,您必须加密(https)用户和Web服务器之间的所有流量(甚至在它们进行身份验证之前,否则活动攻击者可能会更改用户输入的表单提交的action凭证,以使其不通过安全渠道发布。)