正则表达式中的 JSLint“不安全 ^”

Posted

技术标签:

【中文标题】正则表达式中的 JSLint“不安全 ^”【英文标题】:JSLint "insecure ^" in regular expression 【发布时间】:2011-05-05 18:49:59 【问题描述】:

JSLint 报告 Insecure '^' 用于以下行。这是为什么?或者它只是在我想否定一个角色类的时候抱怨?

// remove all non alphanumeric, comma and dash characters
"!$7s-gd,&j5d-a#".replace(/[^\w,\-]/g, '');

【问题讨论】:

因为它是 JSLint :p 否定可能被视为“接受太多”,包括有趣的 [unicode] 控制字符(它只能猜测正则表达式,它不知道语义)。 FWIW,你不需要逃避 - 你拥有它的地方。 @Robusto,在字符类中显式转义连字符是 JSLint 的另一个建议。 另见JSLint reports “Insecure ^” for my regex — what does that mean? 否定也存在性能问题。 【参考方案1】:

regexp: true

在您的 lint 选项中,将允许

. and [^...] in /RegExp/

您可以在此处配置您想使用的规则

http://www.jslint.com/

【讨论】:

【参考方案2】:

考虑使用\W 而不是/^\w/

"!$7s-gd,&j5d-a#".replace(/\W/g, '');

对于您的特定情况,这不起作用,因为您想留下逗号和破折号字符,但我认为值得一提。

【讨论】:

【参考方案3】:

只有在您选择了底部的选项时才会这样做:

Disallow insecure . and [^...] in /RegExp/

来自the docs:

如果 .并且 [^...] 不应该在 RegExp 文字中被允许。在安全应用程序中进行验证时,不应使用这些表单。

所以回答你的问题,如果你用^ 开始一个正则表达式并检查它,是的,它每次都会抛出错误。问题在于 unicode 字符,您允许其中几乎所有内容,并且可能存在安全问题或验证绕过问题。而不是 disallowing 某些东西(可以绕过),allow 只允许哪些字符是有效的。

【讨论】:

Blergh,JSLint 是不是不够聪明,无法看到我正在替换所有东西那些东西? string.match(/[\w,\-]/g, '').join('') 就是这样。 @Tom JSLint 不关心你在做什么它只是提供建议和最佳实践,以防止新手 javascripter 犯愚蠢的错误。如果你能以各种方式证明你正在做的事情是正确的,那就去做,但不要抱怨 JSList 不喜欢它。 抱怨 JSLint 的过于严格是全世界优秀专业人士的消遣。 你不想知道关于jslint的真相......因为你无法处理真相!

以上是关于正则表达式中的 JSLint“不安全 ^”的主要内容,如果未能解决你的问题,请参考以下文章

JSLint - 带有变量的正则表达式的错误转义

如何在 JavaScript 中将长正则表达式拆分为多行?

正则表达式在js中的用法

正则表达式没有想象中的那么难

c# 正则表达式提取()中的值

4-19 Linux中的正则表达式 --- 字符匹配