无用的正则表达式字符转义¶
ID: js/useless-regexp-character-escape
Kind: problem
Security severity: 7.8
Severity: error
Precision: high
Tags:
- correctness
- security
- external/cwe/cwe-020
Query suites:
- javascript-code-scanning.qls
- javascript-security-extended.qls
- javascript-security-and-quality.qls
当字符串文字或正则表达式文字中的字符前缀为反斜杠时,它被解释为转义序列的一部分。例如,字符串文字中的转义序列 \n
对应于单个 换行符
字符,而不是 \
和 n
字符。但是,并非所有字符在转义序列中使用时都会改变含义。在这种情况下,反斜杠只是使字符看起来有不同的含义,而反斜杠实际上没有效果。例如,字符串文字中的转义序列 \k
仅仅表示 k
。这种多余的转义序列通常是良性的,不会改变程序的行为。
对于正则表达式文字和字符串文字,当用在转义序列中时,会改变含义的字符集是不同的。当正则表达式文字被转换为由一个或多个字符串文字构建的正则表达式时,这可能会出现问题。当正则表达式的转义序列在字符串文字中失去其特殊含义时,就会发生此问题。
建议¶
在字符串、模板文字和正则表达式中转义字符时,确保使用正确数量的反斜杠。在将正则表达式重写为字符串文字时,请特别注意反斜杠的数量。
示例¶
以下示例代码检查字符串是否为 "my-marker"
,可能被空格包围
let regex = new RegExp('(^\s*)my-marker(\s*$)'),
isMyMarkerText = regex.test(text);
但是,该检查不能正确处理空格,因为两个 \s
出现等同于 s
,这意味着检查将对类似 "smy-markers"
的字符串成功,而不是 " my-marker "
。通过使用正则表达式文字 (/(^\s*)my-marker(\s*$)/
),或者通过添加额外的反斜杠 ('(^\\s*)my-marker(\\s*$)'
) 来解决这些缺陷。