55import javax .servlet .http .Cookie ;
66import javax .servlet .http .HttpServletRequest ;
77import java .util .*;
8+ import java .util .regex .Matcher ;
9+ import java .util .regex .Pattern ;
810
911public class RequestUtils {
1012 public final static String SECURENATIVE_COOKIE = "_sn" ;
1113 public final static String SECURENATIVE_HEADER = "x-securenative" ;
1214 private final static List <String > ipHeaders = Arrays .asList ("x-forwarded-for" , "x-client-ip" , "x-real-ip" , "x-forwarded" , "x-cluster-client-ip" , "forwarded-for" , "forwarded" , "via" );
15+ private final static List <String > piiHeaders = Arrays .asList ("authorization" , "access_token" , "apikey" , "password" , "passwd" , "secret" , "api_key" );
1316
14- public static Map <String , String > getHeadersFromRequest (HttpServletRequest request ) {
17+ public static Map <String , String > getHeadersFromRequest (HttpServletRequest request , SecureNativeOptions options ) {
1518 Map <String , String > headersMap = new HashMap <>();
16- for (Enumeration <String > headerNames = request .getHeaderNames (); headerNames .hasMoreElements (); ) {
17- String headerName = headerNames .nextElement ();
18- String headerValue = request .getHeader (headerName );
19- headersMap .put (headerName , headerValue );
19+ if (options != null && options .getPiiHeaders ().size () > 0 ) {
20+ for (Enumeration <String > headerNames = request .getHeaderNames (); headerNames .hasMoreElements (); ) {
21+ String headerName = headerNames .nextElement ();
22+ if (!options .getPiiHeaders ().contains (headerName .toLowerCase ()) && !options .getPiiHeaders ().contains (headerName .toUpperCase ())) {
23+ String headerValue = request .getHeader (headerName );
24+ headersMap .put (headerName , headerValue );
25+ }
26+ }
27+ } else if (options != null && options .getPiiRegexPattern () != null ) {
28+ for (Enumeration <String > headerNames = request .getHeaderNames (); headerNames .hasMoreElements (); ) {
29+ String headerName = headerNames .nextElement ();
30+ Pattern pattern = Pattern .compile (options .getPiiRegexPattern (), Pattern .CASE_INSENSITIVE );
31+ Matcher matcher = pattern .matcher (headerName );
32+ if (!matcher .find ()) {
33+ String headerValue = request .getHeader (headerName );
34+ headersMap .put (headerName , headerValue );
35+ }
36+ }
37+ } else {
38+ for (Enumeration <String > headerNames = request .getHeaderNames (); headerNames .hasMoreElements (); ) {
39+ String headerName = headerNames .nextElement ();
40+ if (!piiHeaders .contains (headerName .toLowerCase ()) && !piiHeaders .contains (headerName .toUpperCase ())) {
41+ String headerValue = request .getHeader (headerName );
42+ headersMap .put (headerName , headerValue );
43+ }
44+ }
2045 }
46+
2147 return headersMap ;
2248 }
2349
@@ -38,7 +64,7 @@ public static String getCookieValueFromRequest(HttpServletRequest request, Strin
3864 }
3965
4066 public static String getClientIpFromRequest (HttpServletRequest request , Map <String , String > headers , SecureNativeOptions options ) {
41- if (options .getProxyHeaders ().size () > 0 ) {
67+ if (options != null && options .getProxyHeaders ().size () > 0 ) {
4268 for (String header : options .getProxyHeaders ()) {
4369 if (headers .containsKey (header )) {
4470 String headerValue = headers .get (header );
0 commit comments