我正在使用 PHP 创建一个登录系统,我想知道:为什么需要会话?
如果我使用 userid 和 sessionid 存储一个 cookie,它不会对存储一个带有 userid 和密码哈希的 cookie 带来完全相同的安全风险(假设密码哈希足够强)?是的,有人可能会窃取 cookie,但如果他们窃取 sessionid cookie 不一样吗?
有人能告诉我在每个(相当安全的)登录系统中使用会话的原因是什么吗?
我正在使用 PHP 创建一个登录系统,我想知道:为什么需要会话?
如果我使用 userid 和 sessionid 存储一个 cookie,它不会对存储一个带有 userid 和密码哈希的 cookie 带来完全相同的安全风险(假设密码哈希足够强)?是的,有人可能会窃取 cookie,但如果他们窃取 sessionid cookie 不一样吗?
有人能告诉我在每个(相当安全的)登录系统中使用会话的原因是什么吗?
会话的好处之一是您可以在每次有人登录时生成一个新会话,甚至可以在用户访问期间定期生成一个会话。如果您只是使用用户 ID 和密码的一些哈希值,那么一旦有人窃取了您的 cookie,他们就可以无限期地以您的身份登录。会话到期。
与其创建哈希,不如加密会话 id,以便您可以解密它并查看它是否超时。
如果您还将它绑定到 IP 地址,那么您可以使其更安全。
或者,您可以让用户登录他们想要访问的每个页面。
一旦解决方案是拥有一个实际获取用户所有信息的 javascript 应用程序,因此,用户名/密码存储在 javascript 中。然后,对于每个页面请求或交互,传递用户名/密码或作为某些初始身份验证结果的令牌,该令牌也如上所述加密。
那么你就不需要会话了,如果用户关闭那个选项卡,他们的信息就消失了,所以没有安全风险。
会话 ID 比让 javascript 做所有事情更简单,因此,大多数人选择会话,但您不必这样做。
您描述了一种设计,其中在每个页面请求上验证用户凭据,并且登录表单仅用于将这些凭据存储在浏览器中。我发现这种不寻常的方法存在几个问题:
更典型的做法是验证用户一次(可能使用加密通道或散列信息)并在指定时间内记住它。
无论如何,会话和 cookie 是完全不同的工具。Cookie 是客户端存储,而会话是服务器端。它们只是相互关联,因为最典型的会话实现使用 cookie 来存储会话 ID(由于 HTTP 是无状态协议,因此您需要这些技巧来跟踪来自谁的请求)。服务器端存储的好处是您可以完全控制它:
在经典会话系统中,您在会话开始时分配一个随机 ID,注册用户可以在不同的计算机上同时拥有多个会话实例(甚至在一台计算机上,例如,一个在 Firefox 中,三个在 Chrome 隐身模式窗口中)。如果您仅通过用户名识别访问者,则该用户将只有一个会话:如果他回家吃午饭,他会找到他在工作中留下的会话,如果他与朋友分享他的密码,他会看到他的朋友是什么正在做。这可以被认为是一个错误或一个特性,当然,有很多技巧可以防止它。只要考虑到它。
您可以将 Cookie 设置为立即过期,如果您愿意,也可以设置为一年后过期。当浏览器关闭时,会话立即过期。因此,它们通常更安全。在这种特定情况下,实际上没有什么区别——除了到期时间的长短,以及一个“物理”存储在客户端计算机上,而另一个存储在内存中的事实。
因为是更安全的时期。
通过会话,信息存储在服务器中,因此如果有人仍然需要任何类型的信息,则需要另外几个步骤。使用 cookie,任何人都可以直接从本地机器获取信息,而无需服务器请求。
如果我使用 userid 和 sessionid 存储一个 cookie,它不会对存储一个带有 userid 和密码哈希的 cookie 带来完全相同的安全风险(假设密码哈希足够强)?是的,有人可能会窃取 cookie,但如果他们窃取 sessionid cookie 不一样吗?
是的,这可能是一个类似的风险。出于以下几个原因,可能会认为窃取 cookie 没有那么严重:
但是,是的,在某些情况下,会话 cookie 被盗可能与用户名/密码被盗一样严重。为了防止凭据被盗,您必须加密 (https) 用户和 Web 服务器之间的所有流量(甚至在他们进行身份验证之前,否则主动攻击者可能会更改action用户输入凭据的表单提交,以便使它们不会通过安全渠道发布)。