用戶提交的表單數據是 Web 應用最大的攻擊面之一。本文系統整理 PHP 過濾 HTML 標籤、轉義特殊字符、防範 XSS 攻擊的多層次方案,幫助開發者構建穩健的輸入防護體系。
封裝 htmlspecialchars 與 addslashes,根據 magic_quotes_gpc 狀態自動決定是否雙重轉義,統一處理 $_GET、$_POST、$_COOKIE、$_REQUEST。
<?php
function PostGet($str, $post = 0) {
empty($str) && die('參數為空: ' . $str);
$source = $post ? $_POST : $_GET;
$value = isset($source[$str]) ? $source[$str] : '';
if (get_magic_quotes_gpc()) {
return htmlspecialchars($value);
} else {
return addslashes(htmlspecialchars($value));
}
}
// 使用示例
$username = PostGet('username', 1); // 獲取 POST 的 username
$keyword = PostGet('keyword'); // 獲取 GET 的 keyword
?>
注意:PHP 5.4+ 已移除 magic_quotes_gpc,現代項目建議直接使用 htmlspecialchars 配合預處理語句,不再依賴此特性。
針對允許用戶提交富文本(如評論、文章)的場景,需保留安全標籤(<p>、<b> 等)並剔除危險標籤(<script>、<iframe>、事件屬性等)。
<?php
function uhtml($str) {
$farr = array(
'/\s+/', // 多餘空白
'/<(\/?)(script|iframe|style|html|body|title|link|meta|\?|\%)([^>]*?)>/isU', // 危險標籤
'/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU' // 內聯事件
);
$tarr = array(
' ',
'<\1\2\3>', // 此處可改為 '' 直接刪除
'\1\2' // 移除 on* 事件屬性
);
return preg_replace($farr, $tarr, $str);
}
// 測試
$input = '<script>alert(1)</script><p onclick="xss()">正常內容</p>';
echo uhtml($input);
// 輸出:<script>alert(1)</script><p>正常內容</p>
?>
進階建議:生產環境強烈推薦使用成熟庫 HTMLPurifier,它基於白名單機制,能徹底修復嵌套錯誤、編碼異常等複雜 XSS 向量,且支援自定義允許標籤/屬性/CSS。
過濾輸出只能防範 XSS,防止 SQL 注入必須在資料庫操作層面使用預處理:
<?php
// PDO 範例
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('INSERT INTO comments (content, uid) VALUES (:content, :uid)');
$stmt->execute([
':content' => $_POST['content'], // 無需手動 addslashes
':uid' => $currentUserId
]);
?>
預處理將數據與 SQL 邏輯徹底分離,是防注入的根本之道。
addslashes 防注入。htmlspecialchars。strip_tags 一刀切。htmlspecialchars,JS 用 json_encode,URL 用 urlencode)。<form> 包裹所有輸入控件,否則提交數據丟失。PHP 表單安全防護遵循「輸入過濾、預處理入庫、輸出編碼」三層防線:
htmlspecialchars 防 XSS,白名單過濾富文本;配合 CSP(內容安全策略)HTTP 頭、HttpOnly Cookie、SameSite 屬性,可構建纵深防禦體系。