diff --git a/app/models/site.rb b/app/models/site.rb index c11a2e60..72e24fa0 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -14,6 +14,16 @@ class Site < ApplicationRecord include Site::DefaultOptions include Tienda + # Valida un nombre de dominio: + # + # * Quizás empieza con xn-- + # * Empieza con caracteres alfanuméricos o guión bajo + # * Contiene caracteres alfanuméricos y guiones medios + # * Puede tener hasta 63 caracteres + # * Cada parte termina con un punto + # * Termina sin punto + POSSIBLE_HOSTNAME = %r{((xn--)?[a-z0-9_][a-z0-9\-]{0,61}[a-z0-9]{0,1}\.){1,}(xn--)?[a-z0-9][a-z0-9\-_]{0,61}[a-z0-9]{0,1}}.freeze + self.filter_attributes += [/_key/, /_ciphertext\z/] # Cifrar la llave privada que cifra y decifra campos ocultos. Sutty @@ -32,6 +42,7 @@ class Site < ApplicationRecord validates :description, length: { in: 10..160 } validate :deploy_local_presence validate :compatible_layouts, on: :update + validate :prevent_autolinking attr_reader :incompatible_layouts @@ -639,4 +650,15 @@ class Site < ApplicationRecord compare < ::File.mtime(gemfile_lock_path) end end + + # Valida que el contenido de los campos de texto no contenga nombres + # de dominio, para evitar que al enviarlor por correo se generen + # autolinks maliciosos. + def prevent_autolinking + %i[title description].each do |attr| + next unless POSSIBLE_HOSTNAME.match?(public_send(attr)) + + errors.add(attr, I18n.t("activerecord.errors.models.site.attributes.#{attr}.possible_hostname")) + end + end end diff --git a/config/locales/en.yml b/config/locales/en.yml index fcef8108..ee8ec9f9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -380,6 +380,10 @@ en: models: site: attributes: + description: + possible_hostname: "possibly contains a malicious link." + title: + possible_hostname: "possibly contains a malicious link." deploys: deploy_local_presence: 'We need to be build the site!' design_id: diff --git a/config/locales/es.yml b/config/locales/es.yml index c4ebdde8..dad7c2f2 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -379,6 +379,10 @@ es: models: site: attributes: + description: + possible_hostname: "es posible que contenga un vínculo malicioso." + title: + possible_hostname: "es posible que contenga un vínculo malicioso." deploys: deploy_local_presence: '¡Necesitamos poder generar el sitio!' design_id: