13

我必须在基于 Lithium(PHP 框架)的应用程序中实现登录令牌。两个原因:

我想要一个“记住我”的功能。

我还需要一种在服务器上跟踪登录的方法,以便我可以在 node.js 套接字服务器上验证经过身份验证的用户,如下所示:

  1. 用户请求页面
  2. 服务器在 HTML 中的某处返回带有会话令牌的视图
  3. 客户端 JS 读取令牌并将其发送到 node.js 服务器,以尝试通过 Web 套接字建立连接。
  4. 服务器接收连接请求并使用 PHP 服务器验证发送给它的令牌。
  5. 根据结果​​允许或拒绝连接。

所以这是一个由两部分组成的问题,它只是为了验证我不是白痴,因为这个网站的安全性比平时更重要。

这是创建登录令牌的合理方式吗?

<?php
// String::hash() generates a sha512 (by default) hash. 
String::hash(time() . $user['username']);
?>

我提出的网络套接字身份验证系统是否健全?你能看到出现的任何问题或更有效的方法吗?

4

3 回答 3

6

首先,您应该更改生成登录令牌的方式。当前时间与用户名连接的哈希值远非难以猜测;这是它安全的必要条件。有很多方法可以做到这一点,关键是您使用良好的随机性来源。你可以这样做:

list(,$token) = unpack('H*', openssl_random_pseudo_bytes(15, $safe));
$safe or die("unsafe source");

仅当您传递的不记名令牌从未未加密发送时,您使用的整体方法才是安全的。这意味着每次传输时都必须通过 SSL/TLS 传输。

仍然存在您可能不小心将令牌发送到错误位置的问题,因此如果任何目的地以某种方式动态生成(例如通过某些发现协议),您必须格外小心。避免这个问题的唯一方法是使用密码学。

于 2011-07-04T11:08:40.250 回答
5

您应该查看RequestTokenLithium 中的类:http: //li3.me/docs/lithium/security/validation/RequestToken::check() #source

它处理 CSRF 保护,并使用加密安全的随机令牌,基于与上述类似的原理,但使用 bcrypt 提供了额外的保护层,可以匹配任意数量的唯一哈希。

于 2011-07-04T15:57:20.147 回答
2

您可以使用uniqid()函数生成唯一 ID,以增加您的安全性,然后您可以丢弃或与时间一起使用。

<?php
String::hash(time() . uniqid() . $user['username']);
?>
于 2011-07-04T11:10:48.167 回答