Rails4では正規表現が厳しくなった。

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?

Rails3のテキストをRails4で進めていると上記エラーが出ました。

Rails4では正規表現が厳しくなったようです。

次の正規表現を使用しました。

validates :image_url, allow_blank: true, format: {

with: %r{\.(git|jpg|png)$}i,

message: 'はGIF、JPG、PNG画像のURLでなければなりません。

}

 

 

エラーによると ^ と $ は改行に対応していないため危険だと言っています。

例えば、上記正規表現だと次のような入力を受け付けてしまします。

image.jpg\n<script>dangerous_stuff();</script>

 

^ と $は \n の直前までしか有効ではないので上記入力を受け付けてしまいます。

「^ではなく\A」「$ではなく\z」を使うと \n 以降も有効な正規表現となり安全になります。

 

mutiline: trueのオプションを指定することで^ と $を使ってもエラーが出なくなりますが、上記の通りリスクがあるので、「^ではなく\A」「$ではなく\z」を使うほうが良いでしょう。

 

stackoverflowにも記事が上がっていました。

http://stackoverflow.com/questions/577653/difference-between-a-z-and-in-ruby-on-rails-regular-expressions