安全基础
XSS、SQL 注入、密码哈希、输入校验。
35 分钟
安全基础
Web 应用最常见的漏洞来自未过滤的输入与输出。本课覆盖 XSS、SQL 注入、密码哈希与输入校验。前置 php-essentials;路径 /roadmaps/php。
学习目标
- 理解 XSS 与 SQL 注入的原理与防护
- 用
password_hash安全存储密码 - 建立服务端输入校验习惯
XSS 防护
<?php
declare(strict_types=1);
$name = $_GET['name'] ?? 'guest';
// 错误:直接输出
// echo "<p>Hello, $name</p>";
// 正确:转义
echo '<p>Hello, ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '</p>';
模板引擎(Blade、Twig)默认转义;原生 PHP 须手动处理。
SQL 注入防护
// 错误:拼接 SQL
// $sql = "SELECT * FROM users WHERE email = '$email'";
// 正确:预处理语句
$stmt = $pdo->prepare('SELECT id FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
永远用 PDO 预处理;ORM 底层同样依赖参数绑定。
密码哈希
$hash = password_hash($plainPassword, PASSWORD_ARGON2ID);
if (password_verify($inputPassword, $hash)) {
// 登录成功
}
禁止明文或 MD5 存密码;password_verify 自动处理算法升级。
输入校验
function validateEmail(string $email): ?string {
$email = trim($email);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return null;
}
return $email;
}
function validateSlug(string $slug): bool {
return (bool) preg_match('/^[a-z0-9-]+$/', $slug);
}
校验在服务端做;前端校验仅为体验,不能替代。
练习
- 写一个函数,过滤并校验 POST 中的
title(1–100 字符) - 用 PDO 预处理实现按 slug 查询课时
- 注册流程:
password_hash存库,password_verify登录
小结
输出转义、SQL 预处理、密码哈希、服务端校验——Web 安全四原则。 下一课深入 OOP。
加载本节练习…