在 PHP 中,为了防止安全漏洞(如 SQL 注入、XSS 攻击等),通常需要对用户输入的特殊字符进行转义。以下是常用的转义函数及其用途:
1. HTML 转义
用于防止 XSS(跨站脚本攻击),将特殊字符转换为 HTML 实体。
函数:htmlspecialchars
作用: 将特殊字符转换为 HTML 实体。
常用字符:
& → &
< → <
> → >
" → "
' → '(如果设置了 ENT_QUOTES 标志)
语法:
php
复制
htmlspecialchars(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, string $encoding = "UTF-8", bool $double_encode = true): string
示例:
php
复制
$input = '<script>alert("XSS");</script>';
echo htmlspecialchars($input);
输出:
复制
<script>alert("XSS");</script>
函数:htmlentities
作用: 将所有可转换为 HTML 实体的字符都进行转换(比 htmlspecialchars 更全面)。
示例:
php
复制
$input = '<script>alert("XSS");</script>';
echo htmlentities($input);
输出:
复制
<script>alert("XSS");</script>
2. URL 转义
用于对 URL 中的特殊字符进行编码。
函数:urlencode
作用: 对字符串进行 URL 编码。
常用场景: 用于 GET 请求的参数部分。
示例:
php
复制
$input = 'Hello World!';
echo urlencode($input);
输出:
复制
Hello+World%21
函数:rawurlencode
作用: 对字符串进行 URL 编码(遵循 RFC 3986 标准)。
区别: 空格编码为 %20,而不是 +。
示例:
php
复制
$input = 'Hello World!';
echo rawurlencode($input);
输出:
复制
Hello%20World%21
3. SQL 转义
用于防止 SQL 注入,对数据库查询中的特殊字符进行转义。
函数:mysqli_real_escape_string(MySQLi)
作用: 对字符串中的特殊字符进行转义,以便安全地插入到 SQL 查询中。
语法:
php
复制
mysqli_real_escape_string(mysqli $link, string $string): string
示例:
php
复制
$input = "O'Reilly";
$escaped_input = mysqli_real_escape_string($link, $input);
$sql = "INSERT INTO users (name) VALUES ('$escaped_input')";
函数:PDO::quote(PDO)
作用: 对字符串进行转义并添加引号,以便安全地插入到 SQL 查询中。
示例:
php
复制
$input = "O'Reilly";
$escaped_input = $pdo->quote($input);
$sql = "INSERT INTO users (name) VALUES ($escaped_input)";
4. JavaScript 转义
用于将 PHP 数据安全地嵌入到 JavaScript 中。
函数:json_encode
作用: 将 PHP 数据转换为 JSON 格式,自动处理特殊字符。
示例:
php
复制
$input = ['name' => 'John', 'message' => 'Hello "World"!'];
echo json_encode($input);
输出:
复制
{"name":"John","message":"Hello \"World\"!"}
5. Shell 命令转义
用于防止 命令注入,对 Shell 命令中的特殊字符进行转义。
函数:escapeshellarg
作用: 将字符串转义为安全的 Shell 参数。
示例:
php
复制
$input = 'file; rm -rf /';
$escaped_input = escapeshellarg($input);
echo $escaped_input;
输出:
复制
'file; rm -rf /'
函数:escapeshellcmd
作用: 对 Shell 命令中的特殊字符进行转义。
示例:
php
复制
$input = 'ls; rm -rf /';
$escaped_input = escapeshellcmd($input);
echo $escaped_input;
输出:
复制
ls\; rm -rf /
6. 自定义转义
如果需要更灵活的处理,可以使用正则表达式或字符串替换函数(如 str_replace、preg_replace)进行自定义转义。
总结
场景 函数 用途
HTML 转义 htmlspecialchars 防止 XSS 攻击。
URL 转义 urlencode / rawurlencode 对 URL 参数进行编码。
SQL 转义 mysqli_real_escape_string 防止 SQL 注入。
JavaScript 转义 json_encode 安全嵌入 PHP 数据到 JavaScript。
Shell 转义 escapeshellarg 防止 Shell 命令注入。
在实际开发中,应根据具体场景选择合适的转义函数,并结合预处理语句(如 PDO 预处理)或框架提供的安全机制,确保数据的安全性。
评论