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,或者基本的攻擊模式。
參考資料:
Module ngx_http_map_module
用 map 的功能把 nginx 變成簡單的應用程式防火牆
Orignal From: Nginx 用 map module 設定替換變數 - 資安攻防戰
沒有留言:
張貼留言