PHP无状态身份验证

时间:2012-11-01 13:41:07

标签: php security authentication

我不是PHP新手,但对于身份验证,我总是使用会话。 现在我想进行无状态身份验证,所以我不能使用会话,因为可能有很多服务器实例,并且他们不会共享会话数据,所以我认为我的数据库上有会话表,并且以下内容:

  • 在客户机器中存储带有令牌的cookie
  • 在会话表中有一个令牌列,类似于GUID,因此客户端可以访问具有相同令牌的所有条目
  • 还存储客户端的IP,因此具有相同令牌但不同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发送请求,它将完全访问您的帐户。

我应该考虑一些特殊因素吗?

2 个答案:

答案 0 :(得分:4)

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

区分PHP会话使用cookie的方式与通常使用Cookie的方式不同的是会话don't set any expiration date on the cookie(因此导致浏览器在关闭浏览器时通常会丢弃它们),以及(和是你提出的方法对应的地方)只用一个会话ID(类似于你提出的令牌)填充cookie作为其数据。

那么,那我们离开了哪里?好吧,首先......你所拥有的安全问题(拦截你提出的令牌)也与常规会话相关(拦截会话ID)。如果您想避免这种安全问题,则必须开始使用安全传输(HTTPS使用SSL / TLS)。

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

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

答案 1 :(得分:-1)

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

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