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

MySQL 與 SQL 注入防範完整指南:原理、實例、防禦清單

     編輯:關於SqlServer

SQL 注入定義

將 SQL 命令插入 Web 表單/URL/查詢字串,欺騙伺服器執行惡意 SQL。

核心原則

永不信任使用者輸入,所有輸入視為不安全,必須過濾驗證。

防禦實例:輸入驗證

// 用戶名:字母數字下劃線,8-20 字元
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
    $result = mysql_query("SELECT * FROM users WHERE username=$matches[0]");
} else {
    echo "username 輸入異常";
}

注入風險展示

$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name='{$name}'");
// 若無過濾,將執行 DELETE FROM users

注意: PHP mysql_query() 單次執行一條 SQL,但 SQLite/PostgreSQL 支援多條,風險更高。

六大防禦要點

  1. 永不信任輸入:正則驗證、長度限制、單引號雙連字號轉義
  2. 拒絕動態拼接 SQL:使用參數化查詢或預存程序
  3. 最小權限資料庫帳號:禁止應用使用 SA/Root/DBO
  4. 敏感資料加密/雜湊:密碼 bcrypt/Argon2,不存明文
  5. 錯誤資訊最小化:生產環境關閉詳細錯誤,自定義友善提示
  6. 掃描檢測:工具(jSky、億思平台、MDCSOFT)、WAF (MDCSOFT-IPS)

PHP 防注入實作

if (get_magic_quotes_gpc()) {
    $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM users WHERE name='{$name}'");

LIKE 查詢特殊字元處理

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

addcslashes() 在指定字元(%、_)前加反斜線,防止萬用字元被濫用。

總結

SQL 注入防禦核心:**參數化查詢 + 最小權限 + 輸入驗證 + 錯誤隱藏**。無單一銀彈,需纵深防禦體系。語言/框架無關,原理通用。

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