diff --git a/src/skillspector/nodes/analyzers/static_patterns_prompt_injection.py b/src/skillspector/nodes/analyzers/static_patterns_prompt_injection.py index 9108ae9a7..1714c516b 100644 --- a/src/skillspector/nodes/analyzers/static_patterns_prompt_injection.py +++ b/src/skillspector/nodes/analyzers/static_patterns_prompt_injection.py @@ -102,6 +102,14 @@ def _is_p9_skipped_path(file_path: str) -> bool: rf"(?:{_P2_IDENTIFIER_START}(?:system|POST|GET|send){_P2_IDENTIFIER_END}" r"|ignore|instructions?|transmit)" ) +# Reference-comment titles need a source delimiter scan, rather than a DOTALL +# keyword expression that can backtrack past an already closed title. +_REFERENCE_COMMENT_GAP = r"[ \t]*(?:(?:\r\n|\r|\n)[ \t]*)?" +_REFERENCE_COMMENT_PATTERN = rf"\[//\]:{_REFERENCE_COMMENT_GAP}#" +_REFERENCE_COMMENT_OPENING = re.compile(_REFERENCE_COMMENT_PATTERN) +_REFERENCE_COMMENT_TITLE = re.compile(r"(?:[ \t]+|[ \t]*(?:\r\n|\r|\n)[ \t]*)\(") +_REFERENCE_COMMENT_SPAN = re.compile(r"[\s\S]*") +_REFERENCE_COMMENT_KEYWORD = re.compile(_P2_COMMENT_KEYWORD, re.IGNORECASE) P2_PATTERNS = [ ( # "" and "" are abrupt empty comments: the HTML tokenizer @@ -110,7 +118,7 @@ def _is_p9_skipped_path(file_path: str) -> bool: rf"