为了便于分析,我们将$request_body
字段保存在访问日志中。然而,在日志中暴露了一些敏感信息,如密码或信用卡号码。我们如何掩盖这些信息?
password=1234asdf -> password=****
如果我写一个nginx模块来屏蔽数据,我是应该写一个新的日志模块,还是应该在调用原来的日志模块之前操作请求正文?
或者我应该使用nginx-lua来实现这个目标?
或者还有其他方法吗?
发布于 2016-09-19 16:09:30
使用'echo_read_request_body‘命令获取HTTP POST数据,然后使用'map’和regex过滤密码
map $request_body $req_body_start {
"~(?<nopwd>.*)\&password=[^\&]*.+" $nopwd;
default $request_body;
}
map $request_body $req_body_end {
"~.*\&password=[^\&]*(?<nopwd1>.+)" $nopwd1;
default '';
}
map $request_body $req_body_pwd {
"~.*\&password=[^\&]*.+" '&password=****';
default '';
}
然后定义log_format并在服务器/位置级别使用它:
log_format logreqbody '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$req_body_start$req_body_pwd$req_body_end"';
这里有更多信息:https://www.rstcloud.net/blog/30-how-to-hide-sensitive-post-data-in-nginx-log
发布于 2020-09-17 23:48:10
一个表达式映射,可以屏蔽密码字段,而不考虑其在参数列表中的位置
map $request_body $request_body_masked {
"~(?<pretext>.*)(?<pass0>password)=[^&]+(?<last>.*)$" '$pretext$pass0=*****$last';
default '';
}
针对以下模式进行了测试
但是,需要对在每个请求的主体上运行正则表达式映射的性能成本进行基准测试。
发布于 2018-08-15 12:13:22
这是我的版本。
@Yury Sergeev只有在request.body中只有一个password
时,答案才有效。但是,如果你有一个注册页面,其中你有confirmation_password
和其他密码,如&password=pass1234&confirmation_password=pass1234&withdrawal_password=pass1234
,它将不起作用。
我的版本即使是手动的也是脏的..但它仍然会隐藏这些密码
map $request_body $req_body_step_1 {
"~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request";
default $request_body;
}
map $req_body_step_1 $req_body_step_2 {
"~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request";
default $req_body_step_1;
}
map $req_body_step_2 $req_body_step_3 {
"~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request";
default $req_body_step_2;
}
map $req_body_step_3 $req_body_step_4 {
"~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request";
default $req_body_step_3;
}
map $req_body_step_4 $req_body_step_5 {
"~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request";
default $req_body_step_4;
}
map $req_body_step_5 $req_body_step_6 {
"~(?<pwd>.*password)=[^\&]*(?<end_request>.*)" "$end_request";
default $req_body_step_5;
}
log_format main '"Request-Body": $req_body_step_6';
您的请求主体,如username=3124124&password=3124124&confirmation_password=3124124&withdrawal_password=24124134231&real_name=Dean&phone=13412345678&email=xxx@yahoo.com
将成为username=312412&real_name=Dean&phone=13412345678&email=xxx@yahoo.com
https://stackoverflow.com/questions/37772306
复制相似问题