字串在 SQL 查詢、HTML 輸出、JSON 序列化等場景常需轉義處理,PHP 提供手動與函數兩種機制,正確使用關係資料安全與輸出正確性。
<?php
// SQL 查詢中單引號轉義
echo 'select * from users where name=\'張三\'';
// 輸出:select * from users where name='張三'
?>
| 函數 | 功能 | 語法 | 適用場景 |
|---|---|---|---|
addslashes() | 為預定義字符加反斜線 | string addslashes(string $str) | 通用字串轉義(單引號、雙引號、反斜線、NUL) |
stripslashes() | 移除 addslashes() 加的反斜線 | string stripslashes(string $str) | 還原轉義字串 |
<?php
$str = "select * from users where name='張三'";
echo $str . "<br />"; // 原始
$a = addslashes($str);
echo $a . "<br />"; // 轉義後:select * from users where name=\'張三\'
$b = stripslashes($a);
echo $b . "<br />"; // 還原:select * from users where name='張三'
?>
$mysqli->real_escape_string($str) 或預處理語句(推薦)$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?"); $stmt->execute([$name]);pg_escape_string()<?php
$input = "";
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
// 輸出:<script>alert('xss')</script>
?>
<?php
$data = ['name' => "O'Reilly", 'desc' => "Line1\nLine2"];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
// {"name":"O'Reilly","desc":"Line1\nLine2"} 自動處理轉義
?>
htmlspecialchars()轉義是上下文相關的操作,沒有通用的「萬能轉義」,必須針對目標上下文(SQL、HTML、JS、Shell、LDAP 等)選擇正確的轉義函數。