83

次のコードがあります。

class Product < ActiveRecord::Base
  validates :title, :description, :image_url, presence: true
  validates :price, numericality: {greater_than_or_equal_to: 0.01}
  validates :title, uniqueness: true
  validates :image_url, allow_blank: true, format: {
      with: %r{\.(gif|jpg|png)$}i,
      message: 'URL must point to GIT/JPG/PNG pictures'
  }
end

動作しますが、「rake test」を使用してテストしようとすると、次のメッセージが表示されます。

rake aborted!
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?

どういう意味ですか?どうすれば修正できますか?

4

5 に答える 5

158

^および$行頭アンカー行末アンカーです。While\A\zは、永続的な文字列の開始アンカーと文字列終了アンカーです。 違いを見ます:

string = "abcde\nzzzz"
# => "abcde\nzzzz"

/^abcde$/ === string
# => true

/\Aabcde\z/ === string
# => false

つまり Rails は、「本当に^andを使用しますか?代わりにand$を使用しませんか?」と言います。\A\z

この警告を生成する Rails のセキュリティ上の問題については、こちらを参照してください。

于 2013-07-20T07:57:02.947 に答える
31

この警告は、検証ルールが JavaScript インジェクションに対して脆弱であるため発生します。

あなたの場合\.(gif|jpg|png)$、行末まで一致します。したがって、ルールはこの値pic.png\nalert(1);を true として検証します。

"test.png\n<script>alert(1)</script>" === /\.(gif|jpg|png)$/i
# => true

"test.png\n<script>alert(1)</script>" === /\.(gif|jpg|png)\z/i
# => false

アクティクルを読む:

于 2013-07-20T08:10:22.597 に答える
-1

\zRuby がシンボル記号の代わりに見たい場合$は、セキュリティのために、それを彼に渡す必要があります。コードは次のようになります。

validates :image_url, allow_blank: true, format: {with: %r{\.(gif|jpg|png)\z}i, message: 'URL must point to GIF, JPG, PNG.'}
于 2016-07-31T13:51:17.330 に答える