我正在用PHP创建一个登录系统,我想知道:为什么需要会话?
如果我使用userid存储cookie并且sessionid不存在,则存在与存储具有用户ID和密码哈希值的cookie完全相同的安全风险(假设密码哈希足够强)?是的,有人可能会窃取cookie,但如果他们窃取了sessionid cookie,那不是一样的吗?
有人能告诉我在每个(合理安全的)登录系统中使用会话的原因是什么?
答案 0 :(得分:3)
会话的一个好处是,您可以在每次有人登录时生成新的,甚至在用户访问期间定期生成。如果您刚刚使用了userid和密码的哈希值,那么只要有人偷走了您的cookie,他们就可以无限期地登录。会话到期。
答案 1 :(得分:1)
为什么不加密会话ID,而不是创建哈希,这样你就可以解密它,看看它是否超时。
如果您还将其绑定到IP地址,那么您可以使其更安全。
或者,您可以让用户只需登录他们想要访问的每个页面。
一旦解决方案是拥有一个实际获取用户所有信息的javascript应用程序,那么,用户名/密码将存储在javascript中。然后,对于每个页面请求或交互,传递用户名/密码或作为某些初始身份验证结果的令牌,该令牌也按上述方式加密。
然后您不需要会话,如果用户关闭该选项卡,他们的信息就会消失,因此没有安全风险。
会话ID比使用javascript完成所有操作更简单,因此,大多数人选择会话,但是,您不必这样做。
答案 2 :(得分:1)
您描述了一种设计,其中在每个页面请求上验证用户凭据,并且登录表单仅用于在浏览器中存储这些凭据。我看到了这种不同寻常的方法存在的几个问题:
更典型的做法是验证用户一次(可能使用加密频道或散列信息)并在指定时间内记住它。
无论如何,会话和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被盗可能在某些情况下与用户名/通行证被盗一样严重。要获得对被盗凭据的可靠保护,您必须加密(https)用户和Web服务器之间的所有流量(甚至在它们进行身份验证之前,否则活动攻击者可能会更改用户输入的表单提交的action
凭证,以使其不通过安全渠道发布。)