目录
[1. 数据库查询准备(不推荐直接使用)](#1. 数据库查询准备(不推荐直接使用))
[2. 字符串安全处理](#2. 字符串安全处理)
[3. 配合 json_encode 使用](#3. 配合 json_encode 使用)
[1. 安全问题](#1. 安全问题)
[2. 字符编码问题](#2. 字符编码问题)
[3. 替代方案对比](#3. 替代方案对比)
[1. 现代数据库操作(推荐方式)](#1. 现代数据库操作(推荐方式))
[3. 多层转义处理](#3. 多层转义处理)
[4. 与 stripslashes() 配合使用](#4. 与 stripslashes() 配合使用)
一、函数作用与基本语法
核心功能
addslashes()
是 PHP 中用于字符串转义的函数,主要功能是在特定字符前添加反斜线(\)进行转义,通常用于准备要存入数据库的字符串数据。
转义规则
-
单引号(')→ 转义为 '
-
双引号(")→ 转义为 "
-
反斜线(\)→ 转义为 \
-
NULL 字符(\0)→ 转义为 \0
基本语法
php
string addslashes ( string $str )
参数:$str
- 要转义的字符串 返回值:返回转义后的字符串
二、典型应用场景
1. 数据库查询准备(不推荐直接使用)
php
$name = "O'Reilly";
$safe_name = addslashes($name);
$sql = "INSERT INTO users (name) VALUES ('$safe_name')";
// 生成:INSERT INTO users (name) VALUES ('O\'Reilly')
2. 字符串安全处理
php
$user_input = '"alert("XSS")"';
$safe_output = addslashes($user_input);
// 结果:\"alert(\"XSS\")\"
3. 配合 json_encode 使用
php
$data = ["message" => "It's a \"test\""];
$json = addslashes(json_encode($data));
// 结果:{\"message\":\"It\'s a \\\"test\\\"\"}
三、注意事项与限制
1. 安全问题
-
不适用于所有数据库:不同数据库系统有不同的转义要求
-
不能防止SQL注入:应该使用预处理语句(PDO或mysqli)
-
已被废弃的用法:不再需要用于 magic_quotes_gpc(PHP 5.4+已移除)
2. 字符编码问题
-
仅处理ASCII字符,对多字节字符(如中文)可能产生问题
-
建议先统一转换为UTF-8编码
3. 替代方案对比
场景 | 推荐方案 | 说明 |
---|---|---|
数据库操作 | PDO预处理 | 最安全的防注入方式 |
HTML输出 | htmlspecialchars() | 防止XSS攻击 |
JSON处理 | json_encode() | 自动处理转义 |
四、实用示例与最佳实践
1. 现代数据库操作(推荐方式)
php
// 使用PDO预处理语句(不需要addslashes)
$pdo = new PDO($dsn, $user, $pass);
$stmt = $pdo->prepare("INSERT INTO table (column) VALUES (?)");
$stmt->execute([$unsafe_data]);
3. 多层转义处理
php
$original = "It's a \"test\"";
$escaped = addslashes($original); // 转义一次
$double_escaped = addslashes($escaped); // 转义两次
echo $original; // It's a "test"
echo $escaped; // It\'s a \"test\"
echo $double_escaped; // It\\\'s a \\\"test\\\"
4. 与 stripslashes() 配合使用
php
$data = "O'Reilly";
$escaped = addslashes($data); // O\'Reilly
$original = stripslashes($escaped); // O'Reilly
备注 :在现代PHP开发中,应优先考虑使用预处理语句而不是
addslashes()
。该函数主要适用于遗留系统维护或特定场景下的简单转义需求。对于新项目,建议使用更安全的替代方案。