6
1

More than 3 years have passed since last update.

Deviseのデフォルトのメールアドレスバリデーションが弱すぎる件に対処する

Posted at

Railsでユーザのログイン機能を実装する場合、言わずと知れた Devise を使うといろんな機能がすぐに使えて便利ですよね。デフォルトでは、メールアドレスとパスワードで登録・ログインするようになっていますが、今更ながら不正なメールアドレスが登録されてしまうというバグを生み出してしまいました :innocent:

Deviseにおけるメールアドレスのバリデーションには、

$ bin/rails g devise:install

で生成される config/initializers/devise.rb に定義されている正規表現が使われるのですが…

/\A[^@\s]+@[^@\s]+\z/

うーん、弱い!

ということで、今回は email_validator というGemを使って、メールアドレスの有効性をある程度きちんと検証できるようにしていきます。

email_validatorをインストール

Gemfileにemail_validatorを追記し、インストールします。

Gemfile
gem 'email_validator'
bundle install

Deviseの設定を書き換える

config/initializers/devise.rb に定義されている正規表現を、email_validatorが提供している正規表現に書き換えます。

email_validatorも、デフォルト(Loose mode)の正規表現はDeviseと同様に /\A[^\s]+@[^\s]+\z/ となっているので、Strict modeかRFC modeの正規表現を使うようにしましょう。RFCに準拠すると、メールアドレスでよく使われている文字が使えないことがあるので、今回はStrict modeを使うことにします。

config/initializers/devise.rb
- config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
+ config.email_regexp = EmailValidator.regexp(mode: :strict)

これで、メールアドレスの有効性をある程度きちんと検証できるようになりました :tada:

最後に

今回は、mode: :strict と明示的にStrict modeを使うように指定しましたが、Gemfileに

Gemfile
gem 'email_validator', require: 'email_validator/strict'

のように記述することで、デフォルトをStrict modeにすることもできます。

Railsは便利なGemが多く、盲目的に使うと思わぬバグや脆弱性を仕込んでしまう可能性があります。注意して使いたいですね(自分への戒め :angel:

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1