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