Emoji Picker 未使用 CDN URL 进行自定义表情

描述

标准表情符号路径未转换为 CDN URL,而管理员表情符号路径已正确转换。

证据

标准控制器(无 CDN 转换):

管理员控制器(使用 EmojiSerializer 正确转换):

标准表情符号路径应像管理员表情符号路径一样转换为 CDN URL。

2 个赞

您是否在 UI 中看到这些 URL 被使用?我怀疑它们在 JS 应用中被转换为 CDN URL 后再显示。

我已检查并确认表情符号在渲染输出中直接使用 S3 URL(以 // 开头),而不是 CDN URL。

您在哪个页面上看到此内容?

您可以在使用表情符号选择器时的帖子撰写页面上看到这一点。加载自定义表情符号时,它们会直接使用 S3 端点,例如:

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

这表明路径未按预期转换为 CDN URL。


正在测试自定义表情符号 :awthanks:

:up_arrow: 这是从 S3 CDN 发货的……我们有一个关于选择器本身的问题 @j.jaffeux

自定义表情符号没有使用 S3 CDN

这个 UI 使用了 S3 CDN

所以这非常具体地指向了表情符号选择器,正在改进标题。

1 个赞

谢谢,这应该可以解决问题:

3 个赞

感谢您为启用自定义表情符号的 CDN 使用所做的 PR。

虽然您的前端修复正确地请求了表情符号 CDN 地址,但我担心后端安全。
https://meta.discourse.org/emojis.json 端点仍然会暴露 S3 源 URL,例如 //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 个赞