Featured image of post ZodのemailバリデーションでRFCで違反はないのにエラーになってしまった話

ZodのemailバリデーションでRFCで違反はないのにエラーになってしまった話

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

ZodのEmailバリデーションでとくに問題ないメールアドレスなのにエラーっていわれてしまった。 Zodのバージョンは [email protected] なので 2023/08/01時点で最新かと思います。

そのようなメールアドレスが問題なのか?

上記のメールアドレスにおいて、ドメイン部のハイフンがエラーになると怒らました。
どうやら c.email.polidog.jp もしくは em-ail.polidog.jp なら問題ないようです。

問題はなにか?

メールアドレス用の正規表現に問題があるようです。

https://github.com/colinhacks/zod/blob/22f3cc6ed52a28c984a0319a1a03e1af244cee02/src/types.ts#L553

どの用に対処するべきか?

じつはmasterブランチではこの問題は修正されています。

https://github.com/colinhacks/zod/blob/78a409012a4dc34a455f5c4a7e028ca47c921e1b/src/types.ts#L560

自分の場合は email() を使わずに regex() でメールアドレスのバリデーションをするように修正しました。
そのうち新しいバージョンがリリースされたら再度 email() を使うと思っています。

1
2
3
4
5
6
// export const loginSchema = z.object({
//  email: z.string().regex(/^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, { message: '不正なメールアドレスです' }),
//  password: z
//    .string()
//    .nonempty({ message: 'パスワードを入力してください' }),
//})

追記

上記の正規表現にはReDoS脆弱性があると @wwwdddw1 さんから教えていただきました!!!

こちらzod本体でも脆弱性の指摘、及び修正が入っています。

https://github.com/colinhacks/zod/issues/2609

最新のコードは修正されているようです。
https://github.com/colinhacks/zod/pull/2824 https://github.com/colinhacks/zod/blob/master/src/types.ts#L567

ということで基本zodは最新のバージョンを使うのが望ましいかと思います。
ただし何かしらの理由でアップデートできない場合は下記の正規表現で対応できるかと思います。

1
2
3
4
5
6
 export const loginSchema = z.object({
  email: z.string().regex(/^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, { message: '不正なメールアドレスです' }),
  password: z
    .string()
    .nonempty({ message: 'パスワードを入力してください' }),
})

参考

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