php文件安全实现
PHP 文件安全实现方法
输入验证与过滤
对所有用户输入进行严格验证和过滤,使用 filter_var() 或 filter_input() 函数。避免直接使用 $_GET、$_POST 或 $_REQUEST 变量,防止 SQL 注入和 XSS 攻击。
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
防止 SQL 注入 使用预处理语句(PDO 或 MySQLi)替代直接拼接 SQL 查询。PDO 示例:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);
文件上传安全
限制上传文件类型、大小,并重命名文件。使用 move_uploaded_file() 前检查 $_FILES 的 type 和 size。
$allowed = ['image/jpeg', 'image/png'];
if (in_array($_FILES['file']['type'], $allowed)) {
$new_name = uniqid() . '.jpg';
move_uploaded_file($_FILES['file']['tmp_name'], "uploads/$new_name");
}
会话安全 设置安全的会话参数,防止会话劫持:
session_start([
'cookie_httponly' => true,
'cookie_secure' => true,
'use_strict_mode' => true
]);
密码存储
使用 password_hash() 和 password_verify() 处理密码,选择 PASSWORD_BCRYPT 或 PASSWORD_ARGON2ID 算法。
$hash = password_hash($password, PASSWORD_BCRYPT);
if (password_verify($input, $hash)) {
// 验证成功
}
CSRF 防护 生成并验证 CSRF 令牌:
// 生成令牌
$_SESSION['token'] = bin2hex(random_bytes(32));
// 验证令牌
if (hash_equals($_SESSION['token'], $_POST['token'])) {
// 请求合法
}
错误处理 生产环境关闭错误显示,记录到日志:
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/path/to/php-error.log');
HTTP 安全头 设置安全相关的 HTTP 头:
header("X-Frame-Options: DENY");
header("X-Content-Type-Options: nosniff");
header("Content-Security-Policy: default-src 'self'");
文件包含防护 避免动态包含文件,如需包含,限制路径:
$allowed_pages = ['home.php', 'contact.php'];
if (in_array($_GET['page'], $allowed_pages)) {
include($_GET['page']);
}
定期更新
保持 PHP 版本和依赖库更新,及时修补已知漏洞。使用 composer update 更新依赖项。







