Featured image of post 正規表現を使うプロジェクトではeslint-plugin-redosを入れたほうがいいかもしれない。

正規表現を使うプロジェクトではeslint-plugin-redosを入れたほうがいいかもしれない。

Twitter ツイート Hatena Bookmark ブックマーク

ReDos脆弱性ってなかなか気づかないなぁと思っていて、なにかいい方法がないかなと思っていたらeslintのpluginがあったので試してみました。

見つけたきっかけ

zodのemailのバリデーションの正規表現でReDos脆弱性があるという指摘を頂いたので、zodのプロジェクトのPRを見てたら以下のようなPRを見つけました。

https://github.com/colinhacks/zod/pull/2849
このPRではeslint-plugin-redos-detectorというプラグインを入れるPRでしたが、他にもこの手のpluginでeslint-plugin-redosというものがあるようです。

eslint-plugin-redosを使ってみる

試しに自分はeslint-plugin-redosを使ってみました。

1
yarn add --dev eslint-plugin-redos

次に.eslintrc.json を変更します。

1
2
3
4
5
{
  "extends": [
    "plugin:redos/recommended"
  ],
}

あとは適当に schema.jsを作って以下のようなコードを書いてみました。

1
2
3
4
5
6
7
8
9
const { z } = require('zod');


const emailSchema = z
  .object({
    email: z
      .string()
      .regex(/^([A-Z0-9_+-]+\.?)+[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, { message: '不正なメールアドレスです' }),
  });

VSCodeのeslintプラグインいれていると、すでに赤く警告が出ているかと思います。

最後に

ReDos脆弱性はなかなか気づかないものです。
人間が頑張るよりはある程度機械に任せたほうがいいと思うので、eslint-plugin-redosを入れておくといいかもしれません。

今回試したサンプルのリポジトリは公開しています。
polidog/eslint-plugin-redos-sample

参考

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。