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

PHP SQL 注入防禦:基於黑名單過濾的入門級防護代碼分析

     編輯:PHP 相關知識

代碼功能

提供一個獨立文件 checkpostandget.php,在每個 PHP 文件開頭 include,自動合併 $_POST、$_GET (兼容舊版 $HTTP_POST_VARS),遍歷檢測是否包含黑名單關鍵字 (', ;, union 等),發現則彈窗警告並跳轉。

核心代碼

<?php
$ArrFiltrate = array("'", ";", "union"); // 黑名單
$StrGoUrl = ""; // 跳轉目標

function FunStringExist($StrFiltrate, $ArrFiltrate) {
    foreach ($ArrFiltrate as $value) {
        if (eregi($value, $StrFiltrate)) return true; // 不區分大小寫匹配
    }
    return false;
}

// 合併 POST/GET (兼容 PHP 4 無 array_merge)
if (function_exists('array_merge')) {
    $ArrPostAndGet = array_merge($HTTP_POST_VARS, $HTTP_GET_VARS);
} else { /* 手動合併 */ }

// 驗證循環
foreach ($ArrPostAndGet as $value) {
    if (FunStringExist($value, $ArrFiltrate)) {
        echo "";
        // ... 跳轉邏輯
        exit;
    }
}
?>

嚴重缺陷與繞過技巧

  1. 黑名單機制注定失敗:攻擊載荷無限變體 (編碼、大小寫、註釋、異常空白、MySQL 特有語法)。
    例繞過:UN/**/ION, UnIoN, 0x756e696f6e (Hex), CHAR(117,110,105,111,110)。
  2. 關鍵字遺漏:僅 ', ;, union。缺少 select, insert, update, delete, drop, or, and, where, load_file, outfile, into, --, #, /* 等。
  3. 上下文無感:數字型注入 id=1 OR 1=1 無需引號/分號/union 即可繞過。
  4. 棄用函數:eregi (PHP 5.3 棄用, 7.0 移除),$HTTP_*_VARS (PHP 4.1+ 棄用, 5.4 移除)。
  5. JS 跳轉不可靠:用戶可禁用 JS,或直接訪問目標頁面。應用 header('Location: ...') 服務端跳轉。
  6. 誤傷正常業務:用戶名含 "union" (如 "Reunion")、文章含 "select" 將被誤攔截。

正確防禦架構

// 1. 參數化查詢 (根治)
$stmt = $pdo->prepare("SELECT * FROM articles WHERE title LIKE ?");
$stmt->execute(["%{$keyword}%"]);

// 2. 輸入驗證 (白名單/類型)
$id = (int)$_GET['id']; // 強制整數

// 3. 輸出編碼 (防 XSS)
echo htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

// 4. 最小權限數據庫賬號
// GRANT SELECT, INSERT, UPDATE ON db.* TO 'web_user'@'localhost';

// 5. WAF/RASP 作為纵深防禦
// ModSecurity + OWASP CRS / OpenRASP

總結

黑名單過濾是**安全劇場**,提供虛假安全感,極易繞過且誤傷業務。**參數化查詢 (預處理語句) 是防止 SQL 注入的唯一正確方案**。現代框架 (Laravel, Symfony, ThinkPHP 等) ORM/查詢構建器底層均使用預處理,開發者應杜絕手動拼接 SQL。

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