欢迎来到程序员中文网!

首页 Linux Mysql C++ Python PHP JavaScript 资源下载 动态 开源推荐
我要投稿 投诉建议

PHP 安全实战:SQL 注入、XSS 与 CSRF 防御

时间:2026年08月12日 04:46:50 浏览:1

SQL 注入防御


错误示例


$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id"; // 危险!

正确方式(预处理)


$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([':id' => $id]);

XSS(跨站脚本)防御


输出时使用 htmlspecialchars


echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

使用 Laravel Blade:{{ $var }} 自动转义。


CSRF 防御


表单中加入令牌:


// 生成 Token
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

// 表单中隐藏字段
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

// 验证
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF 攻击检测');
}

Laravel 自动处理 CSRF:@csrf 指令。


文件上传安全


// 限制文件类型
$allowed = ['jpg', 'png', 'gif'];
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if (!in_array($ext, $allowed)) {
die('非法文件类型');
}

// 验证 MIME 类型
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $tmp_name);

// 重命名文件,避免路径攻击
$new_name = uniqid() . '.' . $ext;

安全无小事,始终遵循“输入过滤、输出转义”原则。