好吧,我知道老是来这求解有点厚颜无耻,但是为了避免犯错,那么还是厚颜无耻一把好了。谢谢大家赐教。
问题是这样的:如何保证Session是安全且不可伪造的。因为之后为了节省查询数,我想直接在数据库会话上绑定用户的数据,拿到这个Key就相当于得到了用户权限。
[我现在的做法是,Session只作为记录客户活动状况的东西,只有createTime、updateTime和requests这几个字段,用户对应的权限使用另一套Ticket系统来实现。那套系统会给客户端颁发由用户ID和一串随机码组成的凭证来确认用户。但这就意味着多至少一次查询,而且我的架构为了速度和多数据库还不支持各种JOIN。]
我想出的新方案是这样的:
(1)通过将IP地址加入SessionKey的运算条件(整个要素由 IP + 两组随机数 + HTTP_USER_AGENT 组成),然后用MD5输出一段Hash作为Cookie的钥匙来实现。因为MD5快而且定长,这样数据表就好设计了。
(2)这样输出了一段SessionKey,然后再用用户的IP + 这个SessionKey来Hash出另一段SessionVerifyKey。之后将这两个Key组合好发送给客户端(65个字符长)。
(3)下次读出的时候,用返回的SessionKey + 用户的IP产生的Hash比对这个返回的SessionVerifyKey,如果一致就认为是合法的Session,否则就重新产生一个。
实现的代码在这里:
https://github.com/raincious/facula/blob/master/libraries/units/class.session.php#L231但问题是,MD5现在的碰撞率太高了,这样能否保证Session的钥匙无法被撞开呢?或者我最好还是守着旧方法就好了?
而且我看了V2EX的Cookie,其中的auth应该就是Session钥匙,但貌似也只有一个Hash串呢?或者这样就足够安全了?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/92314
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.