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 に答える