Это можно увидеть на странице создания сообщения при использовании палитры эмодзи. При загрузке пользовательских эмодзи они используют прямые конечные точки S3, например:
Спасибо за ваш PR, который включает возможность использования CDN для пользовательских эмодзи.
Хотя ваше исправление на стороне фронтенда корректно запрашивает CDN-адреса эмодзи, меня беспокоит безопасность на стороне бэкенда.
Эндпоинт https://meta.discourse.org/emojis.json по-прежнему раскрывает исходные URL-адреса S3, такие как //assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/6/1/61e481320406f0f82ed780db3f04056128191613.png, что потенциально может привести к злонамеренному использованию и чрезмерным счетам за S3.
Для повышения безопасности предлагаю возвращать CDN-адреса напрямую, аналогично тому, как обрабатываются стандартные эмодзи.
Вот моя попытка исправить код:
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
Да, я знаю, что мы делаем это напрямую для нестандартных эмодзи в emoji.rb, что я предпочитаю контроллеру. Однако я хочу убедиться, что это не вызовет проблем, поэтому пока сделал самое простое решение, но в будущем разберусь с этим глубже.