33

我有一行代码在通过 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 之类的东西并无论如何更改变量。真正的输入验证应该在服务器上完成,客户端浏览器应该坚持使用验证来处理普通用户的滥用行为。

忽略此错误是否安全?我是否在这里错过了一个角度,因为客户端输入验证,我的应用程序将不安全?

4

2 回答 2

30

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

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

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

于 2010-03-03T15:51:35.417 回答
14

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

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

于 2010-03-03T15:46:49.927 回答