1. Qiita
  2. 投稿
  3. Rails4

Rails4以降で正規表現の `^` や `$` を使うと怒られる訳。

  • 6
    いいね
  • 0
    コメント

こんにちは。18歳女子高生ながらエンジニアとして色々なところでアルバイトをしている 7coco です。

Rails で ArgumentError

先日 Rails で validation を書いていたら

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? (ArgumentError)

と Rails に言われました。
要するに「^$はセキュリティ的に問題があるかもよ。\A\zを使いたかったんじゃない?そうじゃなかったら :multiline => true をオプションで書いてね。」と仰っているようです。

^$\A\zに書き換えると Rails は何も言わなくなりますが^$を使うとどんな問題があるのかがわからなかったので調べてみました。

^ / $\A / \z の違い

^ : 行頭
$ : 行末
\A : 文字列の先頭
\z : 文字列の末尾

違いがわかりましたでしょうか。
^, $ は行頭、行末を意味するので複数行の文字列が渡された場合は予期せぬ値を許容してしまう可能性があります。

次の例を見てみましょう。
複雑な正規表現は読むのも考えるのも大変なので、"foo" から始まって "bar" で終わる文字列にマッチする正規表現を考えてみることにします。

^$ の場合

スクリーンショット 2017-02-26 15.02.11.png

「一行目はマッチしていなくても二行目はマッチしているからOK!」という判断になってしまいました。

\A\z の場合

スクリーンショット 2017-02-26 15.04.04.png

今度はきちんと弾かれています。

まとめ

このような問題から Ruby, Rails では ^$ ではなく \A\z を使うのが必要なようです(言語によって違いがあるみたいです)。
また、複数行の入力をもとから想定している場合などは :multiline => true オプションをつければ ^$ を使うこともできます。

参考

Railsの正規表現でよく使われる \A \z って何??