正则表达式中的 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“不安全 ^”的主要内容,如果未能解决你的问题,请参考以下文章