こんにちは。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" で終わる文字列にマッチする正規表現を考えてみることにします。
^ と $ の場合
「一行目はマッチしていなくても二行目はマッチしているからOK!」という判断になってしまいました。
\A と \z の場合
今度はきちんと弾かれています。
まとめ
このような問題から Ruby, Rails では ^ と $ ではなく \A と \z を使うのが必要なようです(言語によって違いがあるみたいです)。
また、複数行の入力をもとから想定している場合などは :multiline => true オプションをつければ ^ と $ を使うこともできます。

