我有一行代码在通过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这样的东西,无论如何都要改变变量。真正的输入验证应该在服务器上完成,客户端浏览器应该坚持使用可以处理普通用户滥用的验证。
忽略此错误是否安全?我在这里错过了一个角度,我的应用程序因客户端输入验证而不安全吗?
答案 0 :(得分:30)
“不安全”在这种情况下意味着“非特定”。点.
和排他范围[^…]
都没有明确定义正则表达式匹配应该的内容。出于验证目的,此可以提出成功匹配您认为不想要的东西的风险(想想:白名单与黑名单)。
在任何情况下,点和独占范围都是正则表达式的有效部分,如果它们符合您的需要(就像在这种情况下),我会认为警告过于谨慎。
恶意用户可以随时摆弄您的页面逻辑;警告更多的是关于页面的常规操作。
答案 1 :(得分:14)
所有它试图告诉你的是,通常最好指定可以输入的内容而不是不能。
在这种情况下,你的正则表达式实际上是剥离了坏字符,因此忽略警告是安全的。