Voyez-vous ces URL utilisées quelque part dans l’interface utilisateur ? Je soupçonne qu’elles sont converties en URL CDN dans l’application JS avant d’être affichées.
Vous pouvez le voir sur la page de composition de publication lorsque vous utilisez le sélecteur d’emojis. Lorsque les emojis personnalisés sont chargés, ils utilisent directement les points de terminaison S3, comme :
Merci pour votre PR qui permet l’utilisation du CDN pour les emojis personnalisés.
Bien que votre correctif frontend demande correctement les adresses CDN des emojis, je suis préoccupé par la sécurité backend.
Le point de terminaison https://meta.discourse.org/emojis.json expose toujours les URL sources S3 comme //assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/6/1/61e481320406f0f82ed780db3f04056128191613.png, ce qui pourrait potentiellement entraîner des abus malveillants et une facturation S3 excessive.
Pour une meilleure sécurité, je suggère de retourner directement les adresses CDN, de manière similaire à la gestion des emojis non personnalisés.
Voici ma tentative de correction du code :
class EmojisController < ApplicationController
def index
emojis = Emoji.allowed.group_by(&:group)
emojis.each do |_, emoji_list|
emoji_list.each do |emoji|
emoji.url = Discourse.store.cdn_url(emoji.url) if emoji.url.present?
end
end
render json: MultiJson.dump(emojis)
end
def search_aliases
render json: MultiJson.dump(Emoji.search_aliases)
end
end
Oui, je sais que nous le faisons directement pour les emojis non personnalisés dans emoji.rb, ce que je préférerais au contrôleur. Je veux m’assurer que cela ne va pas causer de problèmes, j’ai donc apporté la correction la plus simple pour l’instant, mais je creuserai cela à l’avenir.