清理用户输入
使用 htmlspecialchars 和 filter_input 移除危险字符。
清理用户输入 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
清理与验证
验证用于检查数据是否符合要求(不符合时拒绝数据)。
清理通过移除或编码危险字符来处理数据,使其可以安全使用。
两者都需要——先验证,再为输出进行清理。
使用 htmlspecialchars() 输出 HTML
将输出插入 HTML 前始终进行转义,以防止 XSS:
<?php
$name = '<script>alert(1)</script>';
// Dangerous — executes script:
// echo $name;
// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// <script>alert(1)</script>htmlentities() 与 htmlspecialchars()
两者都会转义 HTML,但 htmlentities 会转换 ALL 个适用字符,而 htmlspecialchars 只转换最危险的五个字符:
<?php
$str = '<b>café</b> & "bar"';
// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// htmlentities: also converts é → é
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8filter_var FILTER_SANITIZE_*
filter_var 的清理模式会移除危险内容:
<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com
$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;strip_tags()
从字符串中移除 HTML 标签,也可以选择保留允许的标签:
<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';
// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)
// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>清理 SQL
绝不要使用字符串函数清理 SQL——始终使用预处理语句。正确的方法是:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";
// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();addslashes() 与预处理语句
addslashes() 会转义反斜杠和引号,但对于 SQL 来说 NOT 安全。请改用 PDO 预处理语句。对于非 SQL 用途,例如生成 JavaScript 字符串,addslashes() 仍然可能有用:
<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";清理文件名
从上传的文件名中移除危险字符:
<?php
function sanitizeFilename(string $name): string {
// Remove path traversal chars and other dangerous ones
$name = basename($name); // strip any path
$name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
$name = preg_replace('/_{2,}/', '_', $name); // collapse underscores
return strtolower($name);
}
echo sanitizeFilename('../../../etc/passwd'); // etc_passwd
echo sanitizeFilename('My Photo (1).JPG'); // my_photo_1_.jpg为 ID 转换为整数
这是处理数字 ID 最简单的清理方式——转换为 int,丢弃所有非数字内容:
<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";
// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');
// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');输出上下文很重要
不同的输出上下文需要不同的转义方式:
- HTML 正文 →
htmlspecialchars() - HTML 属性 →
htmlspecialchars(ENT_QUOTES) - JSON/JavaScript →
json_encode() - URL 参数 →
urlencode() - SQL → 预处理语句
urlencode 和 rawurlencode
对要用于 URL 的值进行编码:
<?php
$search = 'hello world & PHP';
echo urlencode($search);
// hello+world+%26+PHP (+ for spaces)
echo rawurlencode($search);
// hello%20world%20%26%20PHP (RFC 3986 — use in paths)
$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;快速检查
在数据库查询中使用用户输入时,防止 SQL 注入的正确方法是什么?
回顾:清理输入
清理规则:
- HTML 输出 →
htmlspecialchars(ENT_QUOTES, 'UTF-8') - SQL → 使用预处理语句,绝不要进行字符串转义
- URL →
urlencode()或rawurlencode() - 文件名 → 使用正则表达式移除危险字符,并使用
basename() - 整数 ID → 使用
(int)进行转换 - 标签 → 使用
strip_tags()筛选允许的标签
常见问题解答
「清理用户输入」课时是免费的吗?
是的 — 「清理用户输入」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「清理用户输入」这节课中我会学到什么?
使用 htmlspecialchars 和 filter_input 移除危险字符。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「清理用户输入」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。