Expresiones regulares con validaciones en RoR 4

Hay 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 bash probarlo con la “prueba de rake”, 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?

^ y $ son anclajes de inicio de línea y fin de línea . While \A y \z son anclajes de Inicio permanente de cadena y Fin de cadena .
Ver la diferencia:

 string = "abcde\nzzzz" # => "abcde\nzzzz" /^abcde$/ === string # => true /\Aabcde\z/ === string # => false 

Así que Rails te está diciendo, “¿Estás seguro de que quieres usar ^ y $ ? ¿No quieres usar \A y \z lugar?”

Hay más sobre la preocupación de seguridad de los Rails que genera esta advertencia aquí .

Esta advertencia aumenta porque su regla de validación es vulnerable para la inyección de JavaScript.

En su caso \.(gif|jpg|png)$ coincide hasta el final de la línea. Entonces su regla validará este valor pic.png\nalert(1); como verdadero:

 "test.png\n" === /\.(gif|jpg|png)$/i # => true "test.png\n" === /\.(gif|jpg|png)\z/i # => false 

Lee las acticas:

El problema de expresiones regulares no está en el diseño, 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