0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

正規表現の書き方に注意。`^`と `$`と `\A` `\z`

Last updated at Posted at 2018-12-22

発生したエラー文

The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?

背景

  # 郵便番号の正規化
  VALID_POSTAL_CODE_REGEX = /^\d{7}$/

  validates :postal_code, presence: true,
                          format: { with: VALID_POSTAL_CODE_REGEX,
                          message: "is invalid format" }

こちらのコードがひっかかった。

原因

エラー文を読み解いていきます。

(^ or $), which may present a security risk

^$ はセキュリティ的リスクを抱えているとのこと。

解決策

① \A and \zに置き換える

Did you mean to use \A and \z

といわれているので、
^\A
$\z
に置き換える。

:multiline => true optionをつける

forgot to add the :multiline => true option?

もしくは、:multiline => true optionをつけると解決するようです。

最善策

しかし、②のやり方では、セキュリティリスクは解決しない模様。
^$ の書き方は、直前の\nしか見てくれないため、例えば

me@example.com\n<script>dangerous_stuff();</script>

このような、テキストも入力を受け付けてしまうので注意。
https://stackoverflow.com/questions/577653/difference-between-a-z-and-in-ruby-regular-expressions

このように直しましょう。

  # 郵便番号の正規化
  VALID_POSTAL_CODE_REGEX = /\A\d{7}\z/

  validates :postal_code, presence: true,
                          format: { with: VALID_POSTAL_CODE_REGEX,
                          message: "is invalid format" }

参考

Difference between \A \z and ^ $ in Ruby regular expressions
Rails4では正規表現が厳しくなった。
Railsの正規表現での^と$

0
0
1

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?