JSLint“禁止正则表达式中的不安全”选项的目的

Posted

技术标签:

【中文标题】JSLint“禁止正则表达式中的不安全”选项的目的【英文标题】:Purpose of JSLint "disallow insecure in regex" option 【发布时间】:2011-01-23 06:40:46 【问题描述】:

我有一行代码在通过 JSLint 运行时出现以下错误:

Lint at line 604 character 48: Insecure '^'.
numExp = parseInt(val[1].replace(/[^\-+\d]/g, ""), 10);

这个错误似乎参考了JSLint的选项页面中的以下描述:

"true if . and [^...]  should not be allowed in RegExp literals.
These forms should not be used when validating in secure applications."

我不太明白如何才能真正认为客户端 javascript 应用程序是安全的。即使使用最严密的正则表达式,仍然可以启动诸如 firebug 之类的东西并无论如何更改变量。真正的输入验证应该在服务器上完成,客户端浏览器应该坚持使用验证来处理普通用户的滥用行为。

忽略此错误是否安全?我是否错过了一个角度,即我的应用程序会因为客户端输入验证而变得不安全?

【问题讨论】:

【参考方案1】:

“不安全”在这种情况下意味着“不特定”。点 . 和专有范围 [^…] 都没有明确定义 应该 与正则表达式匹配的内容。出于验证目的,这可以提出成功匹配您没有想到和不想要的东西的风险(想想:白名单与黑名单)。

在任何情况下,点和排他范围都是正则表达式的有效部分,如果它们满足您的需要(就像在本例中一样),我会认为警告过于谨慎。

恶意用户可以随时修改您的页面逻辑;警告更多的是关于页面的常规操作。

【讨论】:

【参考方案2】:

它试图告诉你的是,通常最好指定可以输入的内容,而不是不能的内容。

在这种情况下,您的正则表达式实际上是在去除坏字符,因此忽略警告是安全的。

【讨论】:

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

Visual Studio 2013 - Web 项目上的 JSLint.NET 安装不显示预期的 Jslint 菜单选项

jslint 是不是有缩进选项或已被删除?

jslint-vim 配置

在 Sublime Text 2 中禁用或覆盖 JSLint 选项

如何关闭 JSLint 缩进警告?

syntastic - 设置 jslint 参数