本文目录导读:

- 最核心的默认保护:
pgsql/mysqli/PDO的预处理语句(Prepared Statements) - 输出转义:
htmlspecialchars()默认防 XSS - PHP 7.0+ 默认
filter_var()用于输入验证 - PHP 8.1+ 默认启用的
SensitiveParameter属性(保护敏感数据) - 默认的
session.use_only_cookies和session.cookie_httponly - 文件上传:
move_uploaded_file()默认检查真实性 - 默认禁止
register_globals和magic_quotes(已移除) - 总结:PHP 不会自动保护所有数据,但默认提供了安全的基础设施
在 PHP 中,“默认保护数据”通常指的是防止常见的安全漏洞(如 SQL 注入、XSS、CSRF 等),PHP 本身并没有一个单一的“保护开关”,而是通过以下默认行为和推荐实践来实现数据保护:
最核心的默认保护:pgsql/mysqli/PDO 的预处理语句(Prepared Statements)
这是 PHP 防止 SQL 注入的最强默认机制。
- PDO(PHP 数据对象) 和 MySQLi 默认支持预处理。
- 当你使用
prepare()+bindParam()或execute()时,数据与 SQL 语句分离,数据库驱动会自动转义特殊字符。 - 默认情况下,若使用预处理,SQL 注入几乎不可能发生。
// 正确做法(默认安全)
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$_POST['email']]);
坏例子(无保护):
// 直接拼接字符串(非常危险,但并非 PHP 默认行为)
$sql = "SELECT * FROM users WHERE email = '{$_POST['email']}'";
输出转义:htmlspecialchars() 默认防 XSS
PHP 没有自动转义所有输出,但提供了默认字符集 UTF-8 和 htmlspecialchars()。
当你输出用户输入时,必须主动调用 htmlspecialchars(),但它的默认参数已经很有保护性:
- 默认转义
&、、、<、> - 默认假设
ENT_QUOTES(转义单引号) - 默认字符集
UTF-8(避免字符集绕过)
// 默认保护 echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
PHP 7.0+ 默认 filter_var() 用于输入验证
PHP 提供了 filter_var() 函数,默认可以过滤/验证常见输入:
// 默认验证邮箱格式
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if ($email === false) { /* 非法输入 */ }
// 默认清洗 URL 编码
$url = filter_var($_POST['url'], FILTER_SANITIZE_URL);
PHP 8.1+ 默认启用的 SensitiveParameter 属性(保护敏感数据)
从 PHP 8.1 开始,可以给函数参数添加 #[SensitiveParameter] 属性,默认隐藏堆栈跟踪中的敏感值(如密码、令牌)。
function login(#[SensitiveParameter] string $password) {
// 如果此处抛出异常,错误日志中密码会被替换为 ***
}
默认的 session.use_only_cookies 和 session.cookie_httponly
PHP 会话默认:
session.use_only_cookies = 1(阻止通过 URL 传递 Session ID)session.cookie_httponly = 1(JavaScript 不能读取 Session Cookie,防止 XSS 窃取)
; php.ini 默认值 session.use_strict_mode = 1 ; 拒绝未初始化的 Session ID(PHP 7.0+) session.cookie_samesite = Lax ; 防止 CSRF(PHP 7.3+)
文件上传:move_uploaded_file() 默认检查真实性
PHP 的 move_uploaded_file() 函数默认只移动通过 HTTP POST 上传的文件,阻止伪造的本地文件路径。
if (move_uploaded_file($_FILES['file']['tmp_name'], $targetPath)) {
// 只有真正的上传文件才会成功
}
默认禁止 register_globals 和 magic_quotes(已移除)
- 老版本(<5.4)中的
register_globals和magic_quotes是危险默认项,但 PHP 5.4+ 已完全移除。 - 现在默认不会自动将
$_GET/$_POST变量注册为全局变量,也不自动转义输入(需要开发者显式处理)。
PHP 不会自动保护所有数据,但默认提供了安全的基础设施
| 保护类型 | PHP 默认行为 | 你需要做什么? |
|---|---|---|
| SQL 注入 | PDO/MySQLi 预处理默认安全 | 始终使用预处理,绝不拼接字符串 |
| XSS | htmlspecialchars() 默认转义 |
每次输出用户数据时调用它 |
| 文件上传 | move_uploaded_file() 验证来源 |
检查 MIME 类型、大小、后缀 |
| Session 安全 | HttpOnly、SameSite 默认开启 |
使用 HTTPS、设置 secure 标志 |
| 敏感信息泄露 | PHP 8.1+ 支持 SensitiveParameter |
为密码/令牌参数添加该属性 |
安全的核心原则:永远不要信任用户输入。 PHP 提供了默认的工具和设置来帮助你,但你必须主动使用它们。