当前位置: 首页 > 面试题库 >

如何使用Log4J屏蔽日志文件中的信用卡号?

薛烨霖
2023-03-14
问题内容

我们的Web应用程序必须与PCI兼容,即,它不得存储任何信用卡号。该应用程序是大型机系统的前端,它在内部处理抄送号,并且-正如我们刚刚发现的那样-
有时仍会在其响应屏幕之一上吐出完整的抄送号。默认情况下,这些响应的全部内容都记录在调试级别,并且从这些响应解析的内容也可以记录在许多不同的位置。因此,我无法找到此类数据泄漏的根源。我必须确保CC号在我们的日志文件中被屏蔽。

正则表达式部分不是问题,我将重用我们已经在其他几个地方使用的正则表达式。但是我只是找不到关于如何使用Log4J更改日志消息的一部分的任何好的资源。筛选器似乎受到更多限制,只能决定是否记录特定事件,而不能更改消息的内容。我还发现了Log4J
的ESAPI安全包装API,乍一看,它有望实现我想要的功能。但是,显然我需要用ESAPI记录器类替换代码中的所有记录器,这很麻烦。我希望有一个更透明的解决方案。

知道如何从Log4J输出中屏蔽信用卡号吗?

更新: 基于@pgras的原始思想,这是一个可行的解决方案:

public class CardNumberFilteringLayout extends PatternLayout {
    private static final String MASK = "$1++++++++++++";
    private static final Pattern PATTERN = Pattern.compile("([0-9]{4})([0-9]{9,15})");

    @Override
    public String format(LoggingEvent event) {
        if (event.getMessage() instanceof String) {
            String message = event.getRenderedMessage();
            Matcher matcher = PATTERN.matcher(message);

            if (matcher.find()) {
                String maskedMessage = matcher.replaceAll(MASK);
                @SuppressWarnings({ "ThrowableResultOfMethodCallIgnored" })
                Throwable throwable = event.getThrowableInformation() != null ? 
                        event.getThrowableInformation().getThrowable() : null;
                LoggingEvent maskedEvent = new LoggingEvent(event.fqnOfCategoryClass,
                        Logger.getLogger(event.getLoggerName()), event.timeStamp, 
                        event.getLevel(), maskedMessage, throwable);

                return super.format(maskedEvent);
            }
        }
        return super.format(event);
    }
}

笔记:

  • 我使用+而不是进行屏蔽*,因为我想区分出该记录器屏蔽CID的情况,后端服务器或其他任何人进行屏蔽的情况。
  • 我使用简单的正则表达式,因为我不担心误报

该代码已经过单元测试,因此我相当确信它可以正常工作。当然,如果您发现任何改进的可能性,请告诉我:-)


问题答案:

您可以编写自己的布局并为所有附加程序进行配置…

布局具有一种格式化方法,该方法可以从包含日志消息的loggingEvent中生成一个String。



 类似资料:
  • 我的网站上有一个表格,我的客户用这个表格给我发信息。有时他们会在信息上写上他们的信用卡号。所以这真的很关键。我想掩盖这些信用卡号。但是当然卡号不会定期出现。 例1:1111222233334444 例2:4444 3333 2222 1111 例3:4444-3333-2222-1111 例4:4444-3333-2222-1111 例5:4444-3333-2222-1111 所以我可以屏蔽例如

  • 我需要能够在事件中搜索多种模式中的任何一种,并用掩码值替换模式中的文本。这是我们应用程序中的一项功能,旨在防止敏感信息落入日志。由于信息可能来自各种来源,因此对所有输入应用过滤器是不切实际的。除了日志记录之外,toString()还有其他用途,我不希望toString()对所有调用(仅日志记录)进行统一屏蔽。 我尝试在logback中使用%替换方法。xml: 这是成功的(在用字符实体替换尖括号之后

  • 我想创建单独的日志文件,一个用于信息,另一个用于调试,我正在使用下面的log4j.property文件,请建议如何修改不同文件中的两级日志记录, 我想请求请发送我更新的属性文件而不是给我搜索或探索的指针,因为我已经花了3-4个小时在Google和StackOverflow上搜索这个解决方案, 提前道谢。

  • 问题内容: 我有一个日志文件,其中添加了以下附加程序: 事实是,每次我运行我的应用程序时,其他日志记录信息都会附加到同一日志文件中。每次我该怎么做才能覆盖文件? 问题答案: 使用RollingFileAppender。

  • 下面是我的请求体xml,我正在用这个请求进行rest调用。具有自定义LoggingInterceptor来记录请求和响应。我想在日志中屏蔽用户和密码。 <代码> 目前,我正在打印以下日志:

  • 我正在开发一个将在OSX和windows上运行的应用程序。我希望将日志写入用户主目录。对于OSX,它将位于/Users//Library/Application Support/MyApp/log目录下,并位于windows下,具体取决于/Users//AppData/MyApp/log目录下的版本。 我能做到这一点的最好方法是什么?我已经四处寻找解决方案,但没有找到任何有用的或我喜欢使用的解决方