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;安全无小事,始终遵循“输入过滤、输出转义”原则。
