【问题标题】:Guide for PHP Sessions and Cookie usage for better securityPHP 会话和 Cookie 使用指南以提高安全性
【发布时间】:2017-12-21 02:00:09
【问题描述】:

我正在开发 php 中的用户登录/注册功能。我想防止会话劫持和 CSRF 攻击。我脑子里有些困惑,正在寻找答案来澄清这些:

详情

注册:表单数据在客户端用 jQuery 进行验证,然后转换为 json 对象并通过 ajax 调用发送。并且数据也在服务器端进行验证,然后注册用户。用户注册后,将使用 random_bytes(); (PHP 7) 函数创建会话令牌,并将 LoggedIn 设置为 true。

$_SESSION['LoggedIn'] = true;
$_SESSION['Token'] = random_bytes(32);

我知道,我需要检查每个私人(成员区域)页面顶部的有效会话。但我不明白目的。以下是我脑海中出现的问题:

  1. 我应该将会话令牌作为隐藏字段发送并针对每个请求进行验证吗?
  2. 我需要设置 cookie 吗?
  3. 如何将会话令牌与 cookie 一起使用以使其更安全?
  4. 如何确保 ajax 请求在服务器端有效?我还需要为访问者生成会话令牌吗?
  5. 我想保持一个星期的活动会话,所以我需要将会话令牌保存在数据库中吗?

【问题讨论】:

    标签: php ajax session cookies


    【解决方案1】:

    用于 csrf 保护:

    1. 在生成登录 html 时,插入一个隐藏字段,其中包含每个登录请求生成的某个令牌。令牌有一个生命周期限制。
    2. 当用户提交登录时,您需要检查令牌。看看它是否仍然有效(即未过期)。
    3. 如果无效,则抛出错误。如果有效,请继续检查凭据。

    对于通用会话身份验证:

    1. 当用户登录时 - 生成一个令牌。将其保存到某种持久层(数据库?文件?内存缓存?)。给它一个到期日期并将其分配给刚刚登录的用户。
    2. 将令牌作为 cookie 发送给用户。
    3. 在每个请求上 - 检查请求是否包含带有登录令牌的 cookie。如果是,请检查数据库中的该令牌。如果它已过期,则将其删除并返回第 1 步

    关于 AJAX: 不用担心 :) ajax 调用没有什么特别之处。如果设置了有效的 cookie,上述过程将处理它并正确加载用户。

    关于“keep-alive”: 只要您在第 4 步中设置了到期日期,会话就会一直保持活动状态

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2012-04-12
      • 2021-12-03
      • 2010-10-14
      • 2020-04-17
      • 2011-04-08
      相关资源
      最近更新 更多