雖然最根本的防禦應在應用程式層對所有輸入資料進行過濾與轉義,但在 Web 伺服器層面增加一道防線同樣重要。本文介紹如何利用 Nginx 的 rewrite 與 $query_string 變數,攔截包含高風險特殊字元的請求,降低 SQL 注入風險。
? 之前的部分(如 /plus/list.php),可直接用 rewrite 正則比對。? 之後的參數部分(如 tid=19&mid=1124'),Nginx 中以 $query_string 變數取得,無法在 rewrite 中直接比對,需搭配 if 判斷。# 錯誤寫法:rewrite 只比對 URI,無法攔截參數中的單引號
rewrite ^.*([\;'\<\>]).* /error.html break;
上述規則只會檢查 /plus/list.php,完全忽略 tid=19&mid=1124' 中的惡意字元。
# 在 server 或 location 區塊中加入
if ($query_string ~* ".*[\;'\<\>].*") {
return 404;
}
~*:不區分大小寫的正則比對[\;'\<\>]:比對分號、單引號、尖括號等高風險字元return 404:直接回傳 404 隱藏伺服器資訊,避免攻擊者探測union、select、drop、-- 等 SQL 關鍵字(需謹慎避免誤判正常流量)。ngx_waf、openresty + lua-resty-waf),提供更完整的規則集與日誌審計。| 優點 | 缺點 |
|---|---|
| 部署簡單、無需修改應用程式 | 僅能攔截明文特徵,無法防禦編碼/混淆攻擊 |
| 效能影響極小 | 可能誤判合法流量(如文章內容含特殊字元) |
| 可作為第一道防線 | 無法替代應用層參數化查詢 |
結論:Nginx 層面過濾可攔截自動化掃描工具與低階攻擊,但絕不可作為唯一防禦手段。請務必在應用程式實作參數化查詢與完整輸入驗證。
Squid 代理伺服器快取配置實戰:記憶體與磁碟快取參數調優
UNIX 環境配置 Intel/Delink/ZOT 網路列印伺服器完整指南:IP 設定、參數調整、ProInstall 自動化與列印服務驗證
Apache 用戶認證實作指南:文本檔與資料庫兩種儲存方式完整範例
遠端桌面連線失敗「用戶端無法連接到遠端電腦」完整排查清單 (含 3389 埠、服務、防火牆、組策略)
Windows 事件日誌「TermService 性能庫不匹配」錯誤修復方案
Web 服務器系統盤 (C:) 權限最小化配置標準表 (IIS 6.0/7.x 通用)
Windows 7 環境安裝 SQL Server 2005 完整圖文教學 (含 IIS、防火牆、遠端連線設定)
IIS Express 完整配置指南:applicationhost.config 結構解析、多站點/虛擬目錄/SSL/避免管理員權限實戰