|
@@ -66,6 +66,13 @@ public final class SensitivePayloadRedactor {
|
|
|
+ "(?:\"(?:[^\"\\\\]|\\\\.)*\""
|
|
+ "(?:\"(?:[^\"\\\\]|\\\\.)*\""
|
|
|
+ "|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|true|false|null)");
|
|
+ "|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|true|false|null)");
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 截断点正好落在敏感值字符串内部时的尾部:值没有闭合引号,上面的成对规则匹配不到,
|
|
|
|
|
+ * 这里把该键冒号后的整段尾巴(到文本末尾)全部盖上。
|
|
|
|
|
+ */
|
|
|
|
|
+ private static final Pattern JSON_UNTERMINATED = Pattern.compile(
|
|
|
|
|
+ "(?i)(\"(?:" + KEY_ALTERNATION + ")\"\\s*:\\s*\")[^\"]*$");
|
|
|
|
|
+
|
|
|
private static final ObjectMapper MAPPER = new ObjectMapper();
|
|
private static final ObjectMapper MAPPER = new ObjectMapper();
|
|
|
|
|
|
|
|
private SensitivePayloadRedactor() {
|
|
private SensitivePayloadRedactor() {
|
|
@@ -92,7 +99,8 @@ public final class SensitivePayloadRedactor {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
String withoutQuoted = JSON_QUOTED.matcher(truncated).replaceAll("$1\"" + MASK + "\"");
|
|
String withoutQuoted = JSON_QUOTED.matcher(truncated).replaceAll("$1\"" + MASK + "\"");
|
|
|
- return clamp(KEY_VALUE.matcher(withoutQuoted).replaceAll("$1=" + MASK));
|
|
|
|
|
|
|
+ String withoutTail = JSON_UNTERMINATED.matcher(withoutQuoted).replaceAll("$1" + MASK);
|
|
|
|
|
+ return clamp(KEY_VALUE.matcher(withoutTail).replaceAll("$1=" + MASK));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/** 星号比原值长时(如 {@code "S1"} → {@code "***"}),最终长度仍不得超过上限。 */
|
|
/** 星号比原值长时(如 {@code "S1"} → {@code "***"}),最终长度仍不得超过上限。 */
|