我正在为我的 php 应用程序编写用户身份验证。请批评我的做法:
成功登录后,我执行 session_regenerate_id() 并将新的 session_id、user_id 和到期时间保存在 db 表中。我还删除了该用户的所有旧会话。
响应中的每个链接或表单操作 url 都包含类似 token=jenjdf723jhfej(保存的 session_id)的内容。
每个请求都会根据数据库中保存的会话进行检查。如果令牌与有效会话匹配,则会生成新的 session_id 并更新数据库,如果不匹配,则包含登录表单并退出。因此,令牌仅对 1 个请求有效。
这种方法安全吗?
我考虑将请求 ip 地址添加到数据库作为附加检查。
如果您能推荐一个好的,我愿意使用现有的身份验证系统。
谢谢
编辑:我实际上决定取消令牌,只在数据库表中存储一个有效会话列表,以及它们的 php 会话 ID 和其他一些信息。仍然可以根据表检查请求,以确认 a) 会话尚未过期 b) 请求来自用户登录时使用的同一 IP 地址。
将来我可能会添加一个一次性令牌。在这种情况下,我可能会用类似的东西生成它$token = md5(uniqid(rand(), true));
这可能意味着这个问题不再有效,但无论如何感谢您的评论。模组/看门人,随心所欲地处理这个问题。