php - 我设置 PHP session 的方式是否存在安全问题?

标签 php mysql session authentication

用户登录后,我将其 $_SESSION['id'] 设置为 MySql 数据库中的 ID。此 ID 自动递增,因此第一个注册的用户的用户 ID 将为 1。

这是处理此问题的安全方法吗?难道对手不能将他们的 $_SESSION['id'] 设置为随机整数并可能用其他人的帐户登录吗?

这是我的login.php 文件:

<?php
    require_once 'includes/header.php';

    if(isset($_POST['submit'])) {
        //  get the POST variables
        $username = $_POST['username'];
        $password = $_POST['password'];

        //  query the database
        $statement = $db->prepare('SELECT * FROM users WHERE username=?');
        $statement->execute(array($username));

        if($user = $statement->fetch()) {
            //  compare password hashes
            if(password_verify($password, $user['password'])) {
                //  successful authentication
                $_SESSION['id']
            }
        }
    }
?>

最佳答案

session 存在一些安全性和可扩展性问题。

仅关注安全性:

  • 默认情况下,由 PHP 管理的 session 由任意标识符(通过 cookie 发送)和链接到该 cookie 的信息(存储在服务器中)组成,因此您无需将用户信息编码到该 cookie 中(很好)。
  • $_SESSION 映射仅在服务器端存储信息,因此信息是私密且安全的(除非您明确执行类似 print_r($_SESSION) 的操作)。存储 user_id 是正确的。
  • 检查您的查询在结果集中是否返回 1 条且仅返回 1 条记录:某些 SQL 注入(inject)攻击可能会操纵您的查询以匹配多个用户。
  • 用户表中的第一行应该是没有权限的用户:如果有人可以注入(inject) SQL 代码,则查询可以匹配所有用户和语句'SELECT * FROM users WHERE username=?' 通常会返回插入的第一个用户,并且您不希望该用户成为管理员。
  • 为该 cookie 设置合理的过期时间(默认 PHP 过期时间为 24 分钟)
  • 您的代码应在操作 $_SESSION 之前调用 session_start()
  • 自 PHP7 session_start() 开始,接受参数 options 来控制大量 session 配置:http://php.net/manual/es/session.configuration.php
  • 不要通过 GET 查询参数传递 session ID(Cookie 内容)
  • 尝试生成尽可能不可预测的 session ID
  • 尽可能限制性地配置 cookie(仅限 http、仅限当前域等)
  • 默认情况下, session 信息存储在文件中,因此如果您在多台计算机上部署服务,则应考虑到这一点。

其他要点:

  • 通过 POST 发送用户和密码(GET 方法会将您的用户和密码保留在 Apache 日志、http 负载均衡器、http 代理等中)
  • 使用 HTTPS 创建 session 以及其余导航(至少在注销之前)
  • 验证输入变量长度。
  • 如果您将信息存储在使用用户输入构建 key 的 $_SESSION 中:验证用户输入。
  • 始终:验证用户输入。

关于php - 我设置 PHP session 的方式是否存在安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44767927/

相关文章:

php - 为什么这在 PHP 中不起作用?

在 Websphere Portal 中扩展用户 session 的 Java 代码

php - 如何在 PHP 和 MySql 中保存和管理 session ID 和用户 ID

php - 如何在 codeigniter 中设置私有(private)类以形成验证回调

php - PHP 中的 Schinke 拉丁词干提取算法

php - 从 fancybox iframe 获取表单字段值并将其返回到 beforeClose 函数

php - 执行此 PHP/SQL/Sort 操作的最快方法是什么

python - 如何在 SSH 关闭的情况下在 MySQL 中存储来自 Twitter Streaming API 的推文

MySQL获取从属状态时出现ER_SPECIFIC_ACCESS_DENIED_ERROR

php - OOP - session 和 PHP