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

PHP 防 SQL 注入完整防禦體系建構指南

     編輯:PHP 相關知識

SQL 注入攻擊面分析

Web 輸入向量:GET、POST、COOKIE、HTTP 標頭。注入載荷必含 SQL 關鍵字:SELECT、UPDATE、DELETE、INSERT、UNION、LOAD_FILE、INTO OUTFILE 等。

第一道防線:關鍵字過濾函式

function inject_check($sql_str) {
    // 使用 preg_match 替代已棄用的 eregi
    return preg_match(
        '/select|insert|update|delete|\'|\/\*.*?\*\/|\.\.\/|\.\/|union|into|load_file|outfile/i',
        $sql_str
    );
}

注意: 僅作輔助攔截,不可作為唯一防禦,繞過手法極多(編碼、註釋、大小寫變形)。

第二道防線:ID 參數專用驗證

function verify_id($id = null) {
    if (!$id) exit('缺少參數!');
    if (inject_check($id)) exit('參數非法!');
    if (!is_numeric($id)) exit('參數非法!');
    return intval($id);
}

第三道防線:字串參數過濾

function str_check($str) {
    if (!get_magic_quotes_gpc()) {
        $str = addslashes($str);  // 相容舊版
    }
    // LIKE 查詢特殊字元跳脫
    $str = str_replace('_', '\_', $str);
    $str = str_replace('%', '\%', $str);
    return $str;
}

第四道防線:大量文字內容處理(文章、評論)

function post_check($post) {
    if (!get_magic_quotes_gpc()) {
        $post = addslashes($post);
    }
    $post = str_replace('_', '\_', $post);
    $post = str_replace('%', '\%', $post);
    $post = nl2br($post);           // 換行轉 <br>
    $post = htmlspecialchars($post); // HTML 實體編碼
    return $post;
}

終極防線:參數化查詢(Prepared Statements)

唯一徹底解決 SQL 注入的方案。

PDO 範例

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,  // 使用真實預處理
]);

$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ? AND status = ?');
$stmt->execute([$username, $status]);
$user = $stmt->fetch();
?>

MySQLi 範例

<?php
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$stmt = $mysqli->prepare('SELECT * FROM users WHERE username = ? AND status = ?');
$stmt->bind_param('ss', $username, $status);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
?>

分層防禦架構總覽

層級技術防禦範圍維護成本
1. WAF/網關規則引擎、語意分析已知攻擊特徵、自動化掃描低(運維層)
2. 框架/中介層全域輸入過濾、CSRF Token通用注入、跨站請求偽造中(框架升級)
3. 業務邏輯層參數化查詢、型別驗證、權限檢查業務特定注入、橫向越權高(開發責任)
4. 資料庫層最小權限帳號、審計日誌、資料加密資料外洩、內部威脅中(DBA 責任)

避坑指南:常見錯誤認知

  1. addslashes() 不安全: 多位元組字元繞過(0xbf27 → 0xbf5c27)
  2. magic_quotes_gpc 不可靠: PHP 5.4+ 已移除,雙重轉義導致資料損壞
  3. 關鍵字黑名單必被繞過: 編碼、內聯註釋、大小寫、同義詞替換
  4. 手動拼接 SQL 無安全版本: 即使經過過濾,語法上下文複雜度極高

現代最佳實務清單

  1. 全專案強制使用 PDO/MySQLi 參數化查詢,禁用 mysql_* 舊擴充套件
  2. 關閉 PDO::ATTR_EMULATE_PREPARES 使用真實預處理
  3. 資料庫帳號最小權限:讀寫分離、敏感表禁止 DROP/ALTER
  4. 啟用一般查詢日誌與慢查詢日誌,配合 SIEM 分析
  5. 定期執行 composer audit、資料庫權限審計
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved