首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在nginx log中屏蔽POST body的敏感信息?

如何在nginx log中屏蔽POST body的敏感信息?
EN

Stack Overflow用户
提问于 2016-06-12 16:43:53
回答 3查看 3.3K关注 0票数 7

为了便于分析,我们将$request_body字段保存在访问日志中。然而,在日志中暴露了一些敏感信息,如密码或信用卡号码。我们如何掩盖这些信息?

代码语言:javascript
运行
复制
password=1234asdf  ->  password=****

如果我写一个nginx模块来屏蔽数据,我是应该写一个新的日志模块,还是应该在调用原来的日志模块之前操作请求正文?

或者我应该使用nginx-lua来实现这个目标?

或者还有其他方法吗?

EN

回答 3

Stack Overflow用户

发布于 2016-09-19 16:09:30

使用'echo_read_request_body‘命令获取HTTP POST数据,然后使用'map’和regex过滤密码

代码语言:javascript
运行
复制
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并在服务器/位置级别使用它:

代码语言:javascript
运行
复制
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

票数 3
EN

Stack Overflow用户

发布于 2020-09-17 23:48:10

一个表达式映射,可以屏蔽密码字段,而不考虑其在参数列表中的位置

代码语言:javascript
运行
复制
    map $request_body $request_body_masked {
            "~(?<pretext>.*)(?<pass0>password)=[^&]+(?<last>.*)$"  '$pretext$pass0=*****$last';
            default  '';
    }

针对以下模式进行了测试

  • password=papaya&id=someuser
  • password=papaya&
  • password=papaya
  • &password=papaya
  • id=someuser&password=papaya&remember=1
  • id=someuser&password=papaya

但是,需要对在每个请求的主体上运行正则表达式映射的性能成本进行基准测试。

票数 1
EN

Stack Overflow用户

发布于 2018-08-15 12:13:22

这是我的版本。

@Yury Sergeev只有在request.body中只有一个password时,答案才有效。但是,如果你有一个注册页面,其中你有confirmation_password和其他密码,如&password=pass1234&confirmation_password=pass1234&withdrawal_password=pass1234,它将不起作用。

我的版本即使是手动的也是脏的..但它仍然会隐藏这些密码

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37772306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档