Jslint改进|网址的字符集

时间:2012-08-24 23:08:28

标签: javascript regex

对于这个原型url检查器。请注意,我要做的就是在此时检查长度。

url:            /:\/\/(www\.)?.{1,200}\..{1,1800}/,

Jslint.com提供错误

Insecure '.'

我对此SO post.

上的这个否定字符集有类似的错误

鉴于背景,我认为很明显jslint不喜欢允许所有或大部分都作为测试模式。

所以,我只需要更换。使用域的有效字符集和域后的部分。

对于域我​​可以简化为

[a-zA-Z0-9\-]

域之后的部分字符集是什么...即foo.com /

之后

所以有

//

接着是

www.(optional)

接着是

foo.boo.moo.(note it matched up until the last .) ( this character set is listed above)

接着是

X

如何将所有X组合在一起:

http://www.foo.X

我不关心提取端口或查询信息,我只需要域之后的所有字符集,以使每个jslint的正则表达“安全”。

注意,我只是想逐步改进。

JavaScript,Good Parts在正则表达式章节中有一个很好的URL检查器,但不是我现在需要的。

2 个答案:

答案 0 :(得分:1)

您可以在this answer on StackOverflowRFC 3986

中找到您要查找的正则表达式详细信息

“主机”的特定字符和表达式为:[a-z0-9\-._~%]+

您可能想要记住,有效的URL可以是IP地址(IPv4,IPv6和IPvFuture)的形式,请查看链接的RegEx以获取详细信息。

答案 1 :(得分:1)

您无需更改正则表达式。

如果问题只是JSLint抱怨它,你可以禁用该选项。

要在jslint.com上对其进行测试,请查看选项部分:

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

并点击它将其设置为[true]

然后JSLint将接受你的正则表达式。

或者,您可以使用特殊注释来禁用检查。如果将此测试代码粘贴到JSLint中,它将接受它而无需手动更改选项设置:

/*jslint regexp: true */
var test = /:\/\/(www\.)?.{1,200}\..{1,1800}/;

以下是此选项的documentation

  

容忍.[^...]。在/ RegExp /

     

true如果在RegExp文字中允许.[^...]。它们匹配的材料超出预期,允许攻击者混淆应用程序。在安全应用程序中进行验证时,不应使用这些表单。

对于在正则表达式中使用.的方式,似乎不太可能存在“不安全”,因此我将继续并覆盖JSLint设置。

(我现在看到这是一个非常古老的问题,但也许这个答案对将来的其他人有用。)