Вот такой код:
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?
Что это означает? Как я могу это исправить?
ruby-on-rails
ruby
activerecord
малкоаури
источник
источник
/\.(gif|jpg|png)$/i
? Может быть%r{}
,$
в конце добавит свое .%r{\.(gif|jpg|png)$}i #=> /\.(gif|jpg|png)$/i
,%r{\.(gif|jpg|png)}i #=> /\.(gif|jpg|png)/i
.irb
помочь нам узнать наверняка :)Ответы:
^
и$
является Стартом Лайна и Конца Строки якорей. Хотя\A
и\z
являются постоянным Началом Строки и Конец струнных якорей.Увидеть разницу:
string = "abcde\nzzzz" # => "abcde\nzzzz" /^abcde$/ === string # => true /\Aabcde\z/ === string # => false
Итак, Rails говорит вам: «Вы уверены, что хотите использовать
^
и$
? Разве вы не хотите использовать\A
и\z
вместо этого?»Есть еще одна проблема безопасности, которая вызывает это предупреждение здесь .
источник
:multiline => true
вы исправляете только предупреждение о том, что Rails вы знаете, что делаете.Это предупреждение возникает, потому что ваше правило проверки уязвимо для инъекции javascript.
В вашем случае
\.(gif|jpg|png)$
совпадает до конца строки. Итак, ваше правило подтвердит это значениеpic.png\nalert(1);
как истинное:"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
Прочтите статьи:
источник
Проблема с регулярным выражением не в разработке, а скорее находится в config / initializers / devise.rb. Изменить:
# Regex to use to validate the email address config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i
кому:
# Regex to use to validate the email address config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\Z/i
источник
Предупреждение сообщает вам, что такие строки, как следующие, пройдут проверку, но, вероятно, это не то, что вам нужно:
test = "image.gif\nthis is not an image" re = /\.(gif|jpg|png)$/i re.match(test) #=> #<MatchData ".gif" 1:"gif">
Оба
^
и$
соответствуют началу / концу любой строки, а не началу / концу строки.\A
и\z
соответствует началу и концу полной строки соответственно.re = /\.(gif|jpg|png)\z/i re.match(test) #=> nil
Вторая часть предупреждения («или забыл добавить опцию: multiline => true») сообщает вам, что если вы действительно хотите, чтобы поведение
^
и$
вы могли просто отключить предупреждение, передав эту:multiline
опцию.источник
:multiline
?Если Руби хочет видеть
\z
вместо$
символа знак, в целях безопасности вам нужно передать его ему, тогда код будет выглядеть так:validates :image_url, allow_blank: true, format: {with: %r{\.(gif|jpg|png)\z}i, message: 'URL must point to GIF, JPG, PNG.'}
источник