在現代 Web 開發中,「永不信任用戶輸入」是鐵律。PHP 提供了多個內建函數協助開發者過濾、轉義輸入,防範 SQL 注入、XSS 跨站腳本等常見攻擊。雖然現代框架與 IDE(如 PhpStorm、Zend Studio)已提供語法高亮與靜態分析,甚至有代碼混淆工具(如 Zend Guard)保護邏輯,但理解這些函數的核心機制仍是寫出安全代碼的基石。本文逐一剖析 8 個關鍵安全函數的定義與工作原理。
mysql_real_escape_string() —— 過時的防注入衛士該函數為特殊字符(單雙引號等)加上反斜槓,使輸入在 SQL 查詢中被視為字面值。注意:必須在已建立資料庫連線後調用。但自 PHP 5.5 棄用、PHP 7.0 移除,新專案應改用 PDO 預處理語句,從根本上杜絕注入風險。
addslashes() —— 需謹慎使用的轉義函數功能類似上述函數,但若 php.ini 中 magic_quotes_gpc = On(舊版預設),GET/POST/COOKIE 數據已自動轉義,再次調用會導致雙重轉義。可用 get_magic_quotes_gpc() 檢測狀態。現代開發同樣建議棄用,改用參數綁定。
htmlentities() —— 全字符轉 HTML 實體將所有可轉換的字符(如 < → <)轉為 HTML 實體,有效阻斷 XSS 與部分注入嘗試。適用於需原樣顯示用戶輸入的場景。
htmlspecialchars() —— 核心特殊字符轉義僅轉換 &、"、'、<、> 五個核心字符,性能優於 htmlentities()。輸出到 HTML 內容時的首選函數。
strip_tags() —— 剝離標籤移除字符串中所有 HTML、JavaScript、PHP 標籤。第二個參數可指定允許保留的標籤(如 <b>、<i>),適合論壇、評論等需有限富文本的場景。
md5() —— 32 位不可逆雜湊生成 32 字符十六進制摘要,常用於密碼存儲(僅作示例,實際生產請用 password_hash() + password_verify())。不可逆特性防止明文洩露。
sha1() —— 40 位 SHA-1 雜湊原理同 md5(),輸出 40 字符。同樣不適合直接用於密碼存儲,現代應用應採用 bcrypt/Argon2 等慢速雜湊算法。
intval() —— 強制整數轉換雖非安全專用函數,但將 id、age 等數值型輸入強制轉為 int,可有效阻斷注入 Payload(如 1 OR 1=1 變為 1)。是最輕量的「白名單」過濾手段。
最佳實踐總結:棄用 mysql_* 系列與 addslashes();輸出到 HTML 用 htmlspecialchars();資料庫操作全面採用 PDO 預處理;密碼存儲使用 password_hash();數值輸入用 intval() 或 (int) 強制類型轉換。