可怕的'让我登录'和会话检查

Par*_*ack 36 php mysql session

所以,我知道这已经完成了死亡,但我遇到的所有答案都非常令人困惑/相互矛盾,或者他们的解释是不完整的,我正在努力跟上并利用所有资源做到这一点可用,但我想我已经失去了某个地方.我想一劳永逸地澄清一下.感谢您提前耐心,因为这可能会让您有点长时间的啰嗦.

我的页面顶部有一个小的登录框,如果用户没有登录,它将保持不变.如果他们登录,那么他们将看到一个问候语,其中包含他们的名字,而不是登录框.

会话检查

首先,这里是一个图表(据我所知到目前为止)如何检查用户是否可以访问"仅限会员"的内容.(此代码位于页面顶部以检查和设置变量,例如$loggedin = true;)

会话检查图

就目前而言,我$_SESSION['loggedin']只是用户名.根据我的理解,会话可以伪造或劫持来自同一个域,因此我知道这是非常不安全的(例如,攻击者可能会以某种方式创建一个包含不同用户名和会话的会话 - 即时访问该用户的东西)但是我不知道我应该如何检查会话.我可以想象这样做的唯一方法是每次加载页面时连接到数据库并检查MD5哈希或来自数据库的东西(并更新它)但我想这会产生大量不必要的服务器流量而且我我几乎可以肯定有更好的方法.

在登录

以下是用户登录时发生的情况(以及是否显示问候语或登录框).

登录图

在大多数情况下,我非常坚定这部分(我希望),但我不知道我的MD5哈希应该包含什么,以便以后能够重新检查数据库中的哈希值, cookie和一个新生成的哈希,以确保攻击者没有召唤出一个cookie.另外,如下面的评论中所述,我可能会废弃在哈希中使用IP地址以允许用户保持从多个位置登录(例如,他们的手机和笔记本电脑.)

所以我的问题是:

  • 我应该如何检查我的会话是不是假的?
  • 我该怎么检查我的饼干是不是假的?
  • 在检查到位后,我的登录方法是否足够安全?
  • 我遗漏了什么重要的东西?

如果您有什么想问的话,请在评论中告诉我,我很乐意用尽可能多的信息来编辑我的问题.

rid*_*rid 8

你不能劫持会话的内容.如果您是中间人,那么您可以使用相同的会话ID充当用户.但是,此问题对于任何类型的会话仍然有效.

如果你想防止中间人攻击,你应该使用HTTPS.

使用HTTPS可以保证:

  • 你的会话不是假的,因为攻击者几乎没有办法窃取别人的会话ID并将其用作自己的会话ID
  • 出于同样的原因,你的饼干不是假的
  • 您的登录方法是安全的,因为所有内容都是加密发送和接收的,这使得攻击者几乎不可能看到,修改或拦截从服务器发送和接收的数据

HTTPS的主要缺点是:

  • 你需要购买证书
  • 加密会在网络流量和资源使用中增加一些开销
  • 通过HTTPS发送的数据不会被缓存

  • @Patrick,不,除服务器管理员以外的任何人都可以更改会话的内容.会话存储在服务器上.客户端具有*会话ID*,然后发送服务器.然后,服务器负责从其本地存储中获取由该ID标识的数据,并执行它需要做的任何事情.Firesheep窃取会话ID,以便他们可以向服务器发送与合法用户相同的会话ID.但是,如果所有数据都是通过HTTPS发送的,那么参与HTTPS会话的各方之外的任何人都无法读取会话ID. (6认同)
  • @Partack,会话的内容不是HTTP通信的一部分.会话ID通过HTTP发送,而不是会话内容.HTTP通信将包含响应或POST请求中的请求(GET,POST等,URL),标头(cookie,Accept-Encoding等)和数据.查看[维基百科上的HTTP页面](http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol),了解HTTP请求和响应的样子. (3认同)