首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 表單提交安全防護:HTML 標籤過濾與 XSS 防範實戰

     編輯:PHP 相關知識

PHP 表單輸入安全處理:從基礎過濾到深度防禦

用戶提交的表單數據是 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 配合預處理語句,不再依賴此特性。

方案二:深度 HTML 標籤過濾(白名單機制)

針對允許用戶提交富文本(如評論、文章)的場景,需保留安全標籤(<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 一刀切。
    正確:入庫保存原始數據(經預處理),輸出時根據上下文編碼(HTML 用 htmlspecialchars,JS 用 json_encode,URL 用 urlencode)。
  • 表單完整性:HTML 表單必須用 <form> 包裹所有輸入控件,否則提交數據丟失。

總結

PHP 表單安全防護遵循「輸入過濾、預處理入庫、輸出編碼」三層防線:

  1. 輸入端:htmlspecialchars 防 XSS,白名單過濾富文本;
  2. 存儲端:PDO/MySQLi 預處理語句防 SQL 注入;
  3. 輸出端:根據上下文(HTML/JS/URL/CSS)做相應編碼。

配合 CSP(內容安全策略)HTTP 頭、HttpOnly Cookie、SameSite 屬性,可構建纵深防禦體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved