PHP 安全意味着在每一层防御常见的网络漏洞(OWASP Top 10)— 输入处理、数据库访问、输出、身份验证和配置。由于 PHP 支持了大量网络应用,这些实践至关重要。
1. 防止 SQL 注入 — 预编译语句
->( . []);
= ->();
->([[]]);
PHP 安全意味着在每一层防御常见的网络漏洞(OWASP Top 10)— 输入处理、数据库访问、输出、身份验证和配置。由于 PHP 支持了大量网络应用,这些实践至关重要。
->( . []);
= ->();
->([[]]);
// ❌ echoing raw user input → XSS (injected scripts run in the browser)
echo $_GET['name'];
// ✅ escape output for HTML context
echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
在输出时转义用户控制的数据(htmlspecialchars),以防止注入的 HTML/JS 执行。(Twig/Blade 等模板引擎会自动转义。)
// ✅ use password_hash (bcrypt/argon2) — never plaintext, never MD5/SHA
$hash = password_hash($password, PASSWORD_DEFAULT);
// verify:
if (password_verify($input, $hash)) { /* correct password */ }
PHP 内置的 password_hash/password_verify 使用强大、加盐、缓慢的算法 — 这是存储密码的正确方式。
// generate a token, store in the session, include in forms, verify on submit
$_SESSION['csrf'] = bin2hex(random_bytes(32));
// verify on POST: hash_equals($_SESSION['csrf'], $_POST['csrf'])
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); // validate
$id = (int) $_GET['id']; // cast/whitelist
// never trust $_GET/$_POST/$_COOKIE — validate everything
✓ display_errors=Off in production (don't leak stack traces/internals to users — log instead)
✓ Keep secrets in env vars / config outside the web root, NOT in code/git
✓ Use HTTPS; set secure/httponly/samesite cookie flags
✓ Keep PHP and dependencies UPDATED (composer audit for vulnerable packages)
✓ Validate file uploads (type, size); store outside the web root
✓ Use a maintained framework (Laravel/Symfony) — they handle many protections by default
PHP 应用的安全至关重要,理解这些实践是必要的 — 因为 PHP 支持了网络的大部分,PHP 应用是持续的攻击目标,安全失败可能是灾难性的(数据泄露、账户被攻击、网站篡改)。
PHP 解决了最常见和最危险的网络漏洞,但与某些框架不同,很多防护依赖于开发者遵循正确的实践。
不可商议的基本原则:预编译语句防止 SQL 注入(最常见和最具破坏性的攻击之一),输出转义(htmlspecialchars)防止 XSS,password_hash/password_verify 确保安全的密码存储(绝不使用明文/弱哈希),CSRF 令牌保护状态改变请求,严格的输入验证(绝不信任 $_GET/$_POST/$_COOKIE)是基础。
同样重要的是安全配置:在生产环境中关闭错误显示(错误向攻击者泄露敏感信息),将秘密保持在代码之外,使用 HTTPS 和安全 cookie 标志,验证上传,以及保持 PHP 和依赖项的更新(因为易受攻击的包是主要的攻击向量)。
理解这种分层、纵深防御的方法 — 以及单一忽略的层(一个注入、一个泄露的秘密、一个未转义的输出、一个未修补的依赖)可能会损害整个系统 — 是任何 PHP 开发者必须掌握的重要、高风险知识。
虽然现代框架(Laravel、Symfony)默认提供了许多保护,但理解潜在的威胁和实践是构建安全应用的基本责任,这使其成为一个关键的、与生产 PHP 相关的重要话题。