【问题标题】:MySQL instead of PHP SessionMySQL 代替 PHP 会话
【发布时间】:2023-03-15 09:40:02
【问题描述】:

我应该使用什么方法来保持我的用户的登录状态,比如 google 的 gmail? (如果您愿意,您几乎可以无限期地保持登录 - 保持登录功能 - 即使您的 IP 在会话中更改,gmail 仍然可以识别您)。

PHP 会话持续到浏览器关闭(或 1440 秒),即使使用 session_set_cookie_parameters() 我不知道这是否是一个好习惯。我更喜欢使用MySQL 表。一个用于用户登录尝试,一个用于会话,但我想知道我应该如何完成此操作。

如何识别用户? IP不好,可以改,如果用户使用代理怎么办?我想要的只是使用一种安全便捷的方式。

让我们抛开Network EavesdroppingCross-site Scripting,我尽我所能来应对这些攻击。使用登录尝试日志记录将拒绝蛮力攻击,并且我使用准备好的语句来不注入 sql。

我的另一个问题是,如果我想要一个自己的登录系统,如何防止会话劫持?

【问题讨论】:

  • 一个会话令牌。但要小心,因为 Firesheeps 令牌的任何人都可以使用它;使用 HTTPS 将解决此问题。看看 Twitter 或 Facebook 做了什么。

标签: php mysql authentication session-cookies


【解决方案1】:

我使用第二个特定的 cookie(即不是会话 cookie),名为 ALWAYS

  • 该 cookie 设置的寿命很长(例如一年)
  • 它的值是唯一的,在 PHP 中基于 UID 和其他随机(时间...)事物确定,由哈希键(选择您的算法 - md5 据说是弱的)制成,例如“df67ewbhca9fasdi383hd.347234892.HASHFROMUIDSPECIFIC "
  • 该值存储在 MySQL - 用户行 - 当用户登录时
  • 遵循以下算法

    user_login() {
      if ( not signed in ) {
         if (cookies[ALWAYS] is present AND value is in DB AND not null) {
            log the user from that row , automatically
            create his session
         }
         else {
            regular_login()
         }
      }
    }
    
  • 当用户注销时,始终删除 cookie,并在 DB 中将该值设置为 null

这样,之前登录的用户(一年内,可以更改)在会话到期时自动登录,从他们最初登录的同一浏览器。

当用户注销时,通过从数据库中删除值来消除 cookie 被盗的可能性 (...)。因此,即使它可能被盗,它也不能再使用了。

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多