1

我对 PHP 并不陌生,但对于身份验证,我一直使用会话。现在我想做无状态身份验证,所以我不能使用会话,因为可能有很多服务器实例,它们不会共享会话数据,所以我认为我的数据库上有一个会话表,然后做以下:

  • 在客户端机器中存储一个带有令牌的 cookie
  • 在会话表中有一个令牌列,类似于 GUID,因此客户端可以访问具有相同令牌的所有条目
  • 还要存储客户端的ip,所以相同token不同IP的人是无法读取数据的

像这样的东西

id   | token        | ip         | key       | data
1    | a-guid       | 190.0.0.1  | username  | encrypted-data
2    | a-guid       | 190.0.0.1  | is_logged | more-encrypted-data 
3    | other-guid   | 190.2.2.2  | is_logged | some-more-data

因此,具有令牌 a-guid 和 ip 190.0.0.1 的 cookie 的用户可以访问用户名和 *is_logged*

但我不确定安全性,如果有人能以某种方式从您的 cookie 和您的 ip 中获取您的令牌,并且他/她可以使用您的 cookie 令牌和您的 ip 发送请求,它将完全访问您的帐户。

我应该有一些特殊的考虑吗?

4

2 回答 2

4

您似乎对许多人的会话机制有同样的误解。尽管有一些 PHP 能够跟踪会话的机制,但最典型的会话跟踪方式已经与您提出的机制完全相同,即:使用带有一些唯一令牌的普通旧常规 cookie。

PHP会话使用cookie的方式与通常使用cookie的方式不同的是,会话不会在cookie上设置任何到期日期(因此导致浏览器通常在您关闭浏览器时丢弃它们),并且(这就是您提出的方法对应的地方)仅使用会话 ID(类似于您提出的令牌)作为其数据填充 cookie。

那么,这将把我们留在哪里?好吧,一方面...您的安全问题(拦截您提出的令牌)也与常规会话相关(拦截会话 ID)。如果您想避免这种安全问题,您必须开始使用安全传输(使用 SSL/TLS 的HTTPS )。

就使用中央会话表而言,正如您所建议的那样……这确实是一条常见的路线。你知道什么?PHP 已经有一种机制可以通过常规会话“轻松”解决这个问题,即session_set_save_handler().

此函数允许您注册函数(或自 5.4 起具有 interface 的对象SessionHandlerInterface)读取和写入您认为合适的任何持久存储。这也可能意味着您的数据库中有一些会话表。请注意,尽管编写这些函数/方法可能很棘手。但是您可能可以在 Web 和/或 Stack Overflow 上找到很好的示例。

于 2012-11-01T14:56:10.137 回答
-1

如果您在他们进行身份验证时创建一个随机字符串,将其保存在会话的数据库中并使用它来加密上述信息怎么办?任何获得令牌的服务器都可以使用存储的秘密来解密会话,但它不能被第三方伪造。

您将保存在 cookie 中的所有内容都是加密数据加上一些用于查找机密的值。

于 2012-11-01T13:51:50.403 回答