Existe el siguiente código:
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
Funciona, pero cuando intento probarlo usando "rake test", captaré este mensaje:
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?
Qué significa eso? ¿Cómo puedo arreglarlo?
ruby-on-rails
ruby
activerecord
malcoauri
fuente
fuente
/\.(gif|jpg|png)$/i
? Quizás%r{}
agregue el suyo$
al final.%r{\.(gif|jpg|png)$}i #=> /\.(gif|jpg|png)$/i
,%r{\.(gif|jpg|png)}i #=> /\.(gif|jpg|png)/i
.irb
que ayudarnos a saberlo con certeza :)Respuestas:
^
y$
son anclas de inicio de línea y final de línea . Mientras\A
y\z
son anclajes permanentes de inicio de cadena y final de cadena .Ver la diferencia:
string = "abcde\nzzzz" # => "abcde\nzzzz" /^abcde$/ === string # => true /\Aabcde\z/ === string # => false
Entonces Rails te está diciendo: "¿Estás seguro de que quieres usar
^
y$
? ¿No quieres usar\A
y en su\z
lugar?"Hay más preocupación por la seguridad de los rieles que genera esta advertencia aquí .
fuente
:multiline => true
que solo corrige la advertencia que dice Rails, sabe lo que está haciendo.Esta advertencia surge porque su regla de validación es vulnerable a la inyección de JavaScript.
En su caso,
\.(gif|jpg|png)$
coincide hasta el final de la línea. Entonces su regla validará este valorpic.png\nalert(1);
como verdadero:"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
Lea los artículos:
fuente
El problema regexp no está en devise, sino que vive en config / initializers / devise.rb. Cambio:
# Regex to use to validate the email address config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i
a:
# Regex to use to validate the email address config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\Z/i
fuente
La advertencia le dice que cadenas como las siguientes pasarán la validación, pero probablemente no sea lo que desea:
test = "image.gif\nthis is not an image" re = /\.(gif|jpg|png)$/i re.match(test) #=> #<MatchData ".gif" 1:"gif">
Ambos
^
y$
coincide con el inicio / final de cualquier línea, no con el inicio / final de la cadena.\A
y\z
coincide con el inicio y el final de la cadena completa, respectivamente.re = /\.(gif|jpg|png)\z/i re.match(test) #=> nil
La segunda parte de la advertencia ("u olvidé agregar la opción: multiline => true") le dice que si realmente desea el comportamiento de
^
y$
puede simplemente silenciar la advertencia pasando la:multiline
opción.fuente
:multiline
?Si Ruby quiere ver en
\z
lugar del$
signo del símbolo, por seguridad, debe dárselo, entonces el código se vería así:validates :image_url, allow_blank: true, format: {with: %r{\.(gif|jpg|png)\z}i, message: 'URL must point to GIF, JPG, PNG.'}
fuente