@@ -924,13 +924,22 @@ def analyze_csp(csp, result, header_name):
924924 check_unsafe_directives (directives , result , header_name )
925925 check_missing_directives (directives , result , header_name )
926926 check_overly_permissive_directives (directives , result , header_name )
927- check_csp_syntax (csp , result , header_name )
927+ # check_csp_syntax(csp, result, header_name)
928928 check_report_uri (directives , result , header_name )
929929
930930
931931def parse_csp (csp ):
932- return dict (
933- directive .split (None , 1 ) for directive in csp .split (';' ) if directive .strip ())
932+ directives = {}
933+ for directive in csp .split (';' ):
934+ directive = directive .strip ()
935+ if not directive :
936+ continue
937+ parts = directive .split (None , 1 )
938+ if len (parts ) == 2 :
939+ directives [parts [0 ]] = parts [1 ]
940+ elif len (parts ) == 1 :
941+ directives [parts [0 ]] = ""
942+ return directives
934943
935944
936945def check_unsafe_directives (directives , result , header_name ):
@@ -946,9 +955,9 @@ def check_unsafe_directives(directives, result, header_name):
946955
947956def check_missing_directives (directives , result , header_name ):
948957 important_directives = ['default-src' , 'script-src' , 'style-src' , 'img-src' ,
949- 'connect-src' , ' frame-src' ]
958+ 'connect-src' ] # Removed frame-src as it's optional when default-src is set
950959 for directive in important_directives :
951- if directive not in directives :
960+ if directive not in directives and 'default-src' not in directives :
952961 result ['issues' ].append (
953962 f"{ header_name } : Missing important directive '{ directive } '." )
954963 result ['recommendations' ].append (
@@ -957,24 +966,26 @@ def check_missing_directives(directives, result, header_name):
957966
958967def check_overly_permissive_directives (directives , result , header_name ):
959968 for directive , value in directives .items ():
960- if '*' in value :
961- result ['issues' ].append (
962- f"{ header_name } : Overly permissive wildcard '*' found in '{ directive } '." )
963- result ['recommendations' ].append (
964- f"Restrict the '{ directive } ' directive to specific sources instead of using '*'." )
965-
969+ values = value .split ()
970+ for val in values :
971+ if val == '*' : # Only flag standalone wildcards
972+ result ['issues' ].append (
973+ f"{ header_name } : Overly permissive wildcard '*' found in '{ directive } '." )
974+ result ['recommendations' ].append (
975+ f"Restrict the '{ directive } ' directive to specific sources instead of using '*'." )
966976
967- def check_csp_syntax (csp , result , header_name ):
968- if not re .match (r'^[a-zA-Z0-9\-]+\s+[^;]+(?:;\s*[a-zA-Z0-9\-]+\s+[^;]+)*$' , csp ):
969- result ['issues' ].append (f"{ header_name } : CSP syntax appears to be invalid." )
970- result ['recommendations' ].append ("Review and correct the CSP syntax." )
977+ # False positives not reliable enough
978+ #def check_csp_syntax(csp, result, header_name):
979+ # if not re.match(r'^[a-zA-Z0-9\-]+\s+[^;]+(?:;\s*[a-zA-Z0-9\-]+\s+[^;]+)*$', csp):
980+ # result['issues'].append(f"{header_name}: CSP syntax appears to be invalid.")
981+ # result['recommendations'].append("Review and correct the CSP syntax.")
971982
972983
973984def check_report_uri (directives , result , header_name ):
974985 if 'report-uri' not in directives and 'report-to' not in directives :
975986 result ['issues' ].append (f"{ header_name } : No reporting directive found." )
976987 result ['recommendations' ].append (
977- "Consider adding a 'report-uri' or 'report-to' directive for CSP violation reporting." )
988+ "Consider adding a 'report-uri (deprecated) ' or 'report-to' directive for CSP violation reporting." )
978989
979990
980991def check_cookies (domain : str ) -> Dict [str , Any ]:
0 commit comments