gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:43:36 24 4
gpt4 key购买 nike

用户登录后,我将其 $_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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com