1

我正在为我的 php 应用程序编写用户身份验证。请批评我的做法:

  1. 成功登录后,我执行 session_regenerate_id() 并将新的 session_id、user_id 和到期时间保存在 db 表中。我还删除了该用户的所有旧会话。

  2. 响应中的每个链接或表单操作 url 都包含类似 token=jenjdf723jhfej(保存的 session_id)的内容。

  3. 每个请求都会根据数据库中保存的会话进行检查。如果令牌与有效会话匹配,则会生成新的 session_id 并更新数据库,如果不匹配,则包含登录表单并退出。因此,令牌仅对 1 个请求有效。

这种方法安全吗?

我考虑将请求 ip 地址添加到数据库作为附加检查。

如果您能推荐一个好的,我愿意使用现有的身份验证系统。

谢谢

编辑:我实际上决定取消令牌,只在数据库表中存储一个有效会话列表,以及它们的 php 会话 ID 和其他一些信息。仍然可以根据表检查请求,以确认 a) 会话尚未过期 b) 请求来自用户登录时使用的同一 IP 地址。

将来我可能会添加一个一次性令牌。在这种情况下,我可能会用类似的东西生成它$token = md5(uniqid(rand(), true));

这可能意味着这个问题不再有效,但无论如何感谢您的评论。模组/看门人,随心所欲地处理这个问题。

4

1 回答 1

1

发明自己的安全算法几乎总是一个坏主意。

这种方法安全吗?

你还没有说你试图保护异教徒是什么——但可能不是。

第一个问题是您正在增加系统的复杂性。复杂性 = 错误,错误会破坏安全性。

通过更改每个请求的会话 ID,您可以获得什么价值?如果您试图防止 CSRF,请使用 cookie 进行会话检查,以确保会话有效。

我考虑将请求 ip 地址添加到数据库作为附加检查

您是否认为 IP 地址不能在会话中合法更改?从未听说过负载平衡?移动客户端?

当用户打开第二个窗口时会发生什么?还是按返回键?

$token = md5(uniqid(rand(), true));

您通过在此处应用转换来减少熵,而不是增加它。

于 2013-11-01T12:27:47.507 回答