0Pricing
PHP Academy · 课时

清理用户输入

使用 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');
// &lt;script&gt;alert(1)&lt;/script&gt;

htmlentities() 与 htmlspecialchars()

两者都会转义 HTML,但 htmlentities 会转换 ALL 个适用字符,而 htmlspecialchars 只转换最危险的五个字符:

<?php
$str = '<b>caf&eacute;</b> & "bar"';

// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

// htmlentities: also converts é → &eacute;
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8

filter_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 反馈 — 无需本地设置。

此课程中的所有课时

  1. GET 与 POST:何时使用哪一个
  2. 使用超全局变量读取表单数据
  3. 输入验证技术
  4. 清理用户输入
← 返回 PHP Academy