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

JSLint "insecure ^" in regular expression

提问人:Thomas R 提问时间:11/6/2010 更新时间:6/24/2014 访问量:17274

问:

JSLint 报告以下行的不安全“^”。为什么?或者它只是在我想否定角色类时抱怨?

// remove all non alphanumeric, comma and dash characters
"!$7s-gd,&j5d-a#".replace(/[^\w,\-]/g, '');
javascript jslint 正则表达式否定

评论

1赞 11/6/2010
因为它是 JSLint :p可能否定可以被视为“接受太多”,包括有趣的 [unicode] 控制字符(它只能猜测正则表达式,它不知道语义)。
1赞 Robusto 11/6/2010
FWIW,你不需要逃避 - 你拥有它的地方。
1赞 Ian Mackinnon 10/16/2012
@Robusto,在字符类中显式转义连字符是另一个 JSLint 建议。
0赞 Bergi 7/31/2013
另请参阅 JSLint 报告我的正则表达式的“不安全 ^”——这是什么意思?
0赞 Ron Wertlen 10/18/2013
否定也存在性能问题。

答:

38赞 Nick Craver 11/6/2010 #1

只有在底部选择了该选项时,它才会执行此操作:

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

文档中

如果为 true。和 [^...] 不应允许在 RegExp 文本中使用。在安全应用程序中进行验证时,不应使用这些表单。

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

评论

3赞 Thomas R 11/6/2010
Blergh,JSLint 是否不够聪明,无法看到我正在替换除这些东西之外的所有东西?string.match(/[\w,\-]/g, '').join('') 那么。
15赞 xj9 11/6/2010
@Tom JSLint 并不在乎你在做什么,它只是提供建议和最佳实践,以防止新手 JavaScript 犯愚蠢的错误。如果你能用各种方式证明你正在做的事情是合理的,那就去做吧,但不要抱怨 JSList 不喜欢它。
18赞 ErikE 7/7/2011
抱怨 JSLint 过于严格是全世界完美专业人士的消遣。
4赞 8/24/2012
你不想知道 JSLint 的真相......因为你无法处理真相!
0赞 dugokontov 10/30/2013 #2

考虑使用代替\W/^\w/

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

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

6赞 David Morrow 6/24/2014 #3

regexp: true

在您的 lint 选项中,将允许

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

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

http://www.jslint.com/