此篇紀錄 Nginx 的 map module 的使用方式,參考官網 map module 是用來替換變數,本篇使用的範例為 user-agent、query_string
map 只能放在 http 的 scope 裡面
Syntax: map string $variable { ... } Default: — Context: http
- 過濾 user-agent 過濾指定的項目
http { map $http_user_agent $bad_user_agent { default 0; ~*crawler 1; ~*wget 1; ~*curl 1; server { ... if ( $bad_user_agent = 1 ){ return 403; } ... } }
反之如果 default 1,可以針對需要的項目設定為 0 允許 get , head , post
http { map $http_user_agent $bad_user_agent { default 1; ~*(get|head|post) 0; server { ... if ( $bad_user_agent = 1 ){ return 403; } ... } }
遇到要 access /etc/passwd 這種攻擊模式的可以替換 query_string
http { map $query_string $bad_query { default 0; # 若是 access "..%2Fetc%2Fpasswd" 設為 1 ~[a-zA-Z0-9_]=(\.\.%2F(%2F)?)+ 1; # 若是 access "%2Fetc%2F" 設為 1 ~[a-zA-Z0-9_]=%2F([a-z0-9_.]+%2F(%2F)?)+ 1; server { ... if ($bad_query = 1) { return 404; } ... }
這是從 Web Server 的一種防禦模式,通常用來抵擋 bot,或者基本的攻擊模式。
參考資料: