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.irbque ayudarnos a saberlo con certeza :)Respuestas:
^y$son anclas de inicio de línea y final de línea . Mientras\Ay\zson anclajes permanentes de inicio de cadena y final de cadena .Ver la diferencia:
string = "abcde\nzzzz" # => "abcde\nzzzz" /^abcde$/ === string # => true /\Aabcde\z/ === string # => falseEntonces Rails te está diciendo: "¿Estás seguro de que quieres usar
^y$? ¿No quieres usar\Ay en su\zlugar?"Hay más preocupación por la seguridad de los rieles que genera esta advertencia aquí .
fuente
:multiline => trueque 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 # => falseLea 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,})$/ia:
# Regex to use to validate the email address config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\Z/ifuente
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.\Ay\zcoincide con el inicio y el final de la cadena completa, respectivamente.re = /\.(gif|jpg|png)\z/i re.match(test) #=> nilLa 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:multilineopción.fuente
:multiline?Si Ruby quiere ver en
\zlugar 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