|
16 | 16 | import java.lang.reflect.Modifier; |
17 | 17 | import java.util.ArrayList; |
18 | 18 | import java.util.Collection; |
| 19 | +import java.util.Collections; |
19 | 20 | import java.util.Date; |
20 | 21 | import java.util.HashMap; |
| 22 | +import java.util.HashSet; |
21 | 23 | import java.util.Iterator; |
22 | 24 | import java.util.List; |
23 | 25 | import java.util.Map; |
| 26 | +import java.util.Set; |
24 | 27 | import org.slf4j.Logger; |
25 | 28 | import org.slf4j.LoggerFactory; |
26 | 29 |
|
27 | 30 | public final class ObjectIntrospection { |
28 | 31 |
|
29 | 32 | private static final Logger log = LoggerFactory.getLogger(ObjectIntrospection.class); |
30 | 33 |
|
| 34 | + /** |
| 35 | + * Field types excluded from object introspection. Covers Groovy meta-fields and logging framework |
| 36 | + * loggers — both introduce deep, cyclic, or sensitive object graphs that are irrelevant for WAF |
| 37 | + * inspection and can trigger false positives (e.g. crs-944-130). |
| 38 | + */ |
| 39 | + private static final Set<String> EXCLUDED_FIELD_TYPES; |
| 40 | + |
| 41 | + static { |
| 42 | + final Set<String> types = new HashSet<>(); |
| 43 | + types.add("groovy.lang.MetaClass"); |
| 44 | + types.add("org.slf4j.Logger"); |
| 45 | + types.add("org.apache.logging.log4j.Logger"); |
| 46 | + types.add("org.apache.logging.log4j.core.Logger"); |
| 47 | + types.add("java.util.logging.Logger"); |
| 48 | + types.add("org.apache.commons.logging.Log"); |
| 49 | + types.add("ch.qos.logback.classic.Logger"); |
| 50 | + EXCLUDED_FIELD_TYPES = Collections.unmodifiableSet(types); |
| 51 | + } |
| 52 | + |
31 | 53 | private static final Method trySetAccessible; |
32 | 54 |
|
33 | 55 | static { |
@@ -287,10 +309,7 @@ private static Object doConversion(Object obj, int depth, State state) { |
287 | 309 | if (Modifier.isStatic(f.getModifiers())) { |
288 | 310 | continue; |
289 | 311 | } |
290 | | - if (f.getType().getName().equals("groovy.lang.MetaClass")) { |
291 | | - continue; |
292 | | - } |
293 | | - if (isLoggingType(f.getType())) { |
| 312 | + if (EXCLUDED_FIELD_TYPES.contains(f.getType().getName())) { |
294 | 313 | continue; |
295 | 314 | } |
296 | 315 | String name = f.getName(); |
@@ -318,20 +337,6 @@ private static Object doConversion(Object obj, int depth, State state) { |
318 | 337 | return newMap; |
319 | 338 | } |
320 | 339 |
|
321 | | - private static boolean isLoggingType(final Class<?> type) { |
322 | | - switch (type.getName()) { |
323 | | - case "org.slf4j.Logger": |
324 | | - case "org.apache.logging.log4j.Logger": |
325 | | - case "org.apache.logging.log4j.core.Logger": |
326 | | - case "java.util.logging.Logger": |
327 | | - case "org.apache.commons.logging.Log": |
328 | | - case "ch.qos.logback.classic.Logger": |
329 | | - return true; |
330 | | - default: |
331 | | - return false; |
332 | | - } |
333 | | - } |
334 | | - |
335 | 340 | private static boolean ignoredFieldName(final String name) { |
336 | 341 | switch (name) { |
337 | 342 | case "this$0": |
|
0 commit comments