核心原則
- 入庫: 防 SQL 注入(參數化查詢/轉義)、去除首尾空白。
- 出庫: 還原轉義字元。
- 顯示: 防 XSS(
htmlspecialchars)、換行轉 <br>。
現代最佳實踐:PDO 參數化查詢(推薦)
<?php
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 入庫:參數化查詢,完全防注入
$stmt = $pdo->prepare("INSERT INTO `tab` (`content`) VALUES (:content)");
$stmt->execute([':content' => $str]);
// 出庫:直接取得原始字串,無需 stripslashes
$stmt = $pdo->prepare("SELECT `content` FROM `tab` WHERE id = :id");
$stmt->execute([':id' => $id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$content = $row['content'];
// 顯示:防 XSS + 換行處理
echo nl2br(htmlspecialchars($content, ENT_QUOTES, 'UTF-8'));
?>
傳統 mysql_* / mysqli 轉義方案(舊專案維護用)
<?php
// 入庫
$str = trim($str); // 去首尾空白
$str = mysqli_real_escape_string($link, $str); // 轉義特殊字元
$sql = "INSERT INTO `tab` (`content`) VALUES ('$str')";
// 出庫
$str = stripslashes($str); // 若 magic_quotes_gpc=On 需還原
// 顯示
echo nl2br(htmlspecialchars($str, ENT_QUOTES, 'UTF-8'));
?>
常見工具函式整理(舊碼參考)
<?php
// 標題/名稱類:去空白、雙單引號轉義
function trans_string_trim($str) {
$str = trim($str);
$str = str_replace("'", "''", $str); // SQL 標準轉義:單引號變兩個單引號
return $str;
}
// 文章/textarea 類:同前,但保留內部空白
function trans_string($str) {
$str = str_replace("'", "''", $str);
return $str;
}
// 顯示在網頁:防 XSS、換行轉 br、可選是否保留空格
function trans_web($string, $keepSpaces = false) {
$string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
$string = nl2br($string);
if (!$keepSpaces) {
$string = str_replace(' ', ' ', $string); // 或移除多餘空白
}
return $string;
}
// 表單 value 顯示:需雙重編碼防破壞屬性
function trans_form_value($str) {
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
// Cookie 讀取:還原魔術引號 + 防 XSS
function trans_cookie($str) {
if (get_magic_quotes_gpc()) $str = stripslashes($str);
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
關鍵提醒
- 棄用
addslashes/eregi_replace: 不支援多位元組字元,易繞過;eregi_* 系列 PHP 7 已移除。
- 統一使用 UTF-8: 資料庫、連線、HTML 頁面、PHP 檔案編碼全鏈路 UTF-8(
charset=utf8mb4)。
- 關閉 magic_quotes_gpc: PHP 5.4+ 已移除,舊版請在
php.ini 關閉。
- 輸出時才編碼: 資料庫儲存原始資料,輸出到 HTML/JS/JSON/CSS 時才做對應編碼(
htmlspecialchars/json_encode/addslashes 等)。
- 內容安全政策 (CSP): 配合 HTTP Header
Content-Security-Policy 纵深防禦 XSS。