¿Estoy loco o no hay ninguna validación en la URL de la imagen de la firma de la entrada del usuario?
Básicamente, ¿un usuario puede introducir lo que quiera y se enviará a otros usuarios?
Además, ¿por qué el tamaño de la base de datos de la URL de la firma se establece en 32_000?
¿Por qué alguien necesitaría 32000 caracteres para una URL a una imagen?
Espeluznante ![]()
Modifiqué el CSS a esto para codificar de forma rígida una altura y anchura máximas;
.signature-img {
max-width: 600px;
max-height: 100px;
width: auto;
height: auto;
display: block;
margin: 5px 0;
}
Cambié el tamaño máximo de la URL de la firma a 250 en plugin.rb
register_user_custom_field_type("signature_url", :string, max_length: 250)
register_user_custom_field_type("signature_raw", :string, max_length: 250)
Añadí esto al final de “on(:user_updated) do |user|” en plugin.rb (no usaré el modo avanzado)
# Validar la URL si no está en modo avanzado
if !SiteSetting.signatures_advanced_mode && user.custom_fields["signature_url"]
url = user.custom_fields["signature_url"]
# Validación estricta: solo HTTPS, solo ciertos tipos de archivos de imagen
unless url =~ /\Ahttps:\/\/\[a-zA-Z0-9.\-\/_]+\.(png|jpe?g|gif|webp)(\?[a-zA-Z0-9=\&]+)?\z/
Rails.logger.warn("[discourse-signatures] Rechazada signature_url inválida para el usuario #{user.id}: #{url.inspect}")
user.custom_fields["signature_url"] = nil
user.save
end
end
Si estoy haciendo algo mal aquí (nunca he trabajado con Discourse antes), por favor corrígelo y muéstrame la forma correcta de hacerlo.