目前,我的身份验证看起来像这样:
通过SSL登录:
- PHP检查数据库的用户名/密码。
- 如果匹配,则生成,发送并存储在Db上的会话cookie
- (会话cookie看起来像userID:IP:random_characters:timestamp)
通过SSL执行操作:
- PHP会根据会话数据库检查cookie。
- 如果会话匹配,则不到一个小时,用户ID& IP匹配它被认为是有效的。
- 如果会话有效,则执行操作并生成新的会话cookie。
- (如果操作是注销,则会话cookie设置为过期时间)
如果cookie被劫持并且在受害者之前的行动的一小时内欺骗了IP,则将验证攻击者并生成新的会话。我还有其他可能出现的问题吗?
什么被认为是最佳做法?我想加强安全性。谢谢!
答案 0 :(得分:1)
您不仅可以将会话绑定到IP,还可以绑定到用户代理。然后一个不那么聪明的攻击者有另一个障碍......虽然他可能有办法偷走更多的会话cookie,如果他可以偷一个然后只是尝试各种使用者。但是,要使其不像更改useragent并使用相同的cookie重试一样简单,请删除会话以要求新登录(使用用户名/密码)。
最后但并非最不重要的是,有CSRF:如果用户登录外部网站,则可以让他执行操作。由于用户的cookie有效,因此将执行此操作。您只能通过URL传递随机令牌来规避这一点。甚至允许使用多个选项卡进行浏览的简单方法是使用会话ID的(随机/变化)部分。只对单个请求有效的随机令牌会更加安全,但是它们非常烦人,因为它们会阻止人们使用多个标签(即使应用程序可以简单地存储多达10个令牌,并且如果存在多个令牌,则只会使旧令牌无效10 - 这将允许您不仅使用最新的令牌,而且还可以使用您在打开新选项卡之前所在页面中的令牌。但很可能一个对整个会话有效的令牌就足够了;假设您使用会话ID或其中的一部分,如果有人可以获得其他人的会话ID,则您遇到的问题比CSRF更大
关于注销,我不仅会使用过期时间而且还会使用空值 - 所以如果出现问题(我看到服务器和用户都有可怕的错误(天+)时钟)。