JSLintオプション考察「. and [^…] in /RegExp/」

2013年08月13日

カテゴリー:

「. and [^…] in /RegExp/」オプションは、正規表現のパターンにおいて、「.」、および「[^~]」の使用を許可するかどうかのオプションです。デフォルト(false)ではこれらのメタ文字の使用は許可されません。

このオプションがデフォルト(false)の状態で、次のコードをJSLintでチェックすると、それぞれ「Insecure ‘.’」「Insecure ‘^’」といった警告が表示されます。

function func() {
    "use strict";

    var pattern1 = /.+/,
        pattern2 = /[^0-9]+/;

    window.console.dir(pattern1.exec("foo"));    //Insecure '.'.
    window.console.dir(pattern2.exec("bar"));    //Insecure '^'.
}
『Insecure』の意味を調べると「不安定な、危なっかしい、頼りにならない、不確かな」といった言葉が出てきます。
要するに、「.」「[^~]」は、信頼性に欠けるから、正規表現パターンの中には組み込まないようにすべきということでしょう。

なぜ「.」「[^~]」は信頼できないのか?

自分の引出しの少なさゆえ具体的なコード例での説明が難しいのですが、調べてみたところ「.」「[^~]」といったメタ文字は、実際にどのような文字にマッチするのかが明確ではないことが理由のようです。そのため、特にクライアントの入力チェック(バリデーション)において使用されるような場合、この不明確さが脆弱性の原因になりうる可能性があるっぽいです。

まぁ、確かに言われてみると、ピリオド「.」がどの文字にマッチするのか?ということを今まで結構曖昧にしたまま使っていたような気がします。

結局のところ

このオプションについては、とりあえずデフォルト(false)のままにしておき、正規表現を使うにあたってどうしても「.」「[^~]」といったメタ文字を使わなければならない場合は true にすれば良いと思います。ただその前に、別の正規表現で置き換えることができないかどうかを一度検討してみた方が良いかもしれませんね。


※本エントリをまとめるにあたって、こちらの記事を参考にさせて頂きました。
JSLintが正規表現に厳しいわけ | 黒くないすべてのものはカラスではない

JSLintのオプション一覧ページへ