Emoji Picker не использует CDN-URLs для пользовательских эмодзи

Описание

Стандартные пути к эмодзи не преобразуются в URL CDN, тогда как пути к эмодзи администратора преобразуются корректно.

Подтверждение

Стандартный контроллер (без преобразования в CDN):

Административный контроллер (корректное преобразование с использованием EmojiSerializer):

Стандартные пути к эмодзи должны преобразовываться в URL CDN, как и пути к эмодзи администратора.

3 лайка

Вы видите, что эти URL-адреса используются где-то в интерфейсе? Я подозреваю, что в JS-приложении они преобразуются в CDN-адреса перед отображением.

1 лайк

Я проверил и могу подтвердить, что эмодзи в рендеринге используют прямые ссылки S3 (начинающиеся с //), а не ссылки CDN.

На какой странице вы это видите?

Это можно увидеть на странице создания сообщения при использовании палитры эмодзи. При загрузке пользовательских эмодзи они используют прямые конечные точки S3, например:

https://assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/1/d/1de8f76096f76cf393640bdcff387ec9ae33dd3e.gif

Это показывает, что пути не преобразуются в URL-адреса CDN, как ожидалось.


Тестирование пользовательских эмодзи :awthanks:

:up_arrow: это раздается через CDN S3… У нас проблема с самим пикером @j.jaffeux

Не используется CDN S3 для пользовательских эмодзи

Этот интерфейс использует CDN S3

Таким образом, это очень специфично для пикера эмодзи, улучшаю заголовок здесь.

2 лайка

Спасибо, это должно исправить проблему:

4 лайка

Спасибо за ваш 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, что я предпочитаю контроллеру. Однако я хочу убедиться, что это не вызовет проблем, поэтому пока сделал самое простое решение, но в будущем разберусь с этим глубже.

2 лайка

Закрыто, так как исходная проблема решена. При необходимости создайте новый запрос на реализацию функции для продолжения работы.

Эти ресурсы очень малы и обычно общедоступны, поэтому риск кажется низким.

2 лайка