Vedi questi URL utilizzati da qualche parte nell’interfaccia utente? Sospetto che vengano convertiti in URL CDN nell’app JS prima di essere visualizzati.
Puoi vederlo nella pagina di composizione del post quando usi il selettore di emoji. Quando le emoji personalizzate vengono caricate, utilizzano direttamente gli endpoint S3, come:\n\nhttps://assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/1/d/1de8f76096f76cf393640bdcff387ec9ae33dd3e.gif\n\nCiò dimostra che i percorsi non vengono convertiti in URL CDN come previsto.
Grazie per la tua PR che abilita l’uso della CDN per le emoji personalizzate.
Mentre la tua correzione frontend richiede correttamente gli indirizzi CDN delle emoji, sono preoccupato per la sicurezza del backend.
L’endpoint https://meta.discourse.org/emojis.json espone ancora URL sorgente S3 come //assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/6/1/61e481320406f0f82ed780db3f04056128191613.png, che potrebbero potenzialmente portare ad abusi malevoli e a fatturazione S3 eccessiva.
Per una maggiore sicurezza, suggerisco di restituire direttamente gli indirizzi CDN, in modo simile a come vengono gestite le emoji non personalizzate.
Ecco il mio tentativo di correggere il codice:
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
Sì, so che lo facciamo direttamente per le emoji non personalizzate in emoji.rb, cosa che preferirei rispetto al controller. Voglio assicurarmi che ciò non causi problemi, quindi per ora ho apportato la correzione più semplice, ma approfondirò in futuro.