gpt4 book ai didi

java - 如何使用 Log4J 掩盖日志文件中的信用卡号?

转载 作者:IT老高 更新时间:2023-10-28 21:13:04 25 4
gpt4 key购买 nike

我们的网络应用需要符合 PCI 标准,即它不能存储任何信用卡号码。该应用程序是大型机系统的前端,它在内部处理 CC 编号,并且 - 正如我们刚刚发现的那样 - 偶尔仍会在其响应屏幕之一上吐出完整的 CC 编号。默认情况下,这些响应的全部内容都记录在调试级别,并且从这些响应中解析的内容可以记录在许多不同的地方。所以我无法追查此类数据泄漏的来源。我必须确保在我们的日志文件中隐藏 CC 编号。

正则表达式部分不是问题,我将重用我们已经在其他几个地方使用的正则表达式。但是,我只是找不到任何关于如何使用 Log4J 更改日志消息的一部分的好资料。过滤器似乎受到更多限制,只能决定是否记录特定事件,但不能改变消息的内容。我还找到了 ESAPI security wrapper API对于 Log4J,它乍一看 promise 会做我想做的事。但是,显然我需要用 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 被此记录器屏蔽的情况和后端完成的情况服务器或其他任何人
  • 我使用简单的正则表达式,因为我不担心误报

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

最佳答案

你可以自己写layout并为所有附加程序配置它...

Layout 有一个 format 方法,它从一个包含日志消息的 loggingEvent 生成一个字符串...

关于java - 如何使用 Log4J 掩盖日志文件中的信用卡号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2461726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com