Miniaturas de chat contornam s3_cdn_url e usam URLs brutas do bucket S3

, ,

Fiz uma configuração recente do bucket de uploads do Cloudflare R2 e as miniaturas de chat foram afetadas. Então, pesquisei um pouco, apliquei uma correção rápida na minha configuração e encontrei este tópico: Cloudflare R2 Image URL Display Issue: Detailed Explanation and Fix. De qualquer forma, analisei outras configurações de buckets de upload S3 e notei que o problema não era realmente específico do Cloudflare.


Descrição

Quando um armazenamento de objetos externo S3 ou compatível é configurado para uploads, as miniaturas de chat contornam a CDN e são carregadas diretamente a partir da URL do bucket.

Para buckets externos seguros e compatíveis com S3, como o Cloudflare R2, as miniaturas de chat ficam quebradas e não são exibidas.

O problema subjacente é que o serializador do chat não está aplicando a configuração s3_cdn_url às miniaturas. Em vez de rotear a imagem através da CDN configurada, ele está expondo diretamente a URL interna bruta do bucket S3 nas cargas úteis do navegador.

Passos para reproduzir

Isso é reproduzível no Meta e em outros sites que usam buckets de upload S3:

  1. Publique uma imagem no chat ou em um canal
  2. Inspecione a URL da imagem de miniatura no console
  3. Clique na imagem para obter a versão original maior e inspecione a URL
  4. Compare-a com a miniatura

Aqui está um exemplo de um chat do Meta:

URL da miniatura: do bucket

https://cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/meta/optimized/4X/4/7/9/479815360e0e6e0cd9f4ba565891776e84aea532_2_375x500.jpeg

URL original: via CDN

https://global.discourse-cdn.com/meta/original/4X/4/7/9/479815360e0e6e0cd9f4ba565891776e84aea532.jpeg

No console, o HTML da miniatura <img... contém data-large-src = URL da CDN CloudFront, e src = URL do bucket AWS.

captura de tela

Impacto:

  • Para armazenamento compatível com S3, como o Cloudflare R2, que é seguro por padrão e bloqueia o acesso não autenticado aos endpoints brutos do bucket, as imagens de miniatura de chat (otimizadas) ficam quebradas.
  • Vazamento de banda para buckets de armazenamento de objetos AWS e outros compatíveis com S3 que permitem acesso aos endpoints brutos do bucket, já que o chat está contornando completamente a CDN; isso resulta em pagamento direto de taxas de egresso do S3 para todo o tráfego de miniaturas de chat.
  • Vazamento de infraestrutura: as URLs de armazenamento backend brutas (incluindo nomes internos de buckets e, às vezes, IDs de conta) estão sendo expostas nas cargas úteis JSON do cliente.

PR:

Tenho um PR para corrigir o problema aqui:

Parece que Sam adicionou o getURLWithCDN à prévia do compositor de chat — no entanto, não acho que isso chegue ao fluxo do chat?

Fico me perguntando se a correção do compositor pode ter falhado para algumas configurações S3 também, porque o getURLWithCDN trava em incompatibilidades de protocolo (// vs https://)? De qualquer forma, o PR acima simplesmente estende o trabalho de Sam adicionando os wrappers ao fluxo e tornando-o agnóstico ao protocolo.

Solução temporária:

Antes de perceber que isso era mais do que um problema do Cloudflare, criei um componente de tema leve. Ele intercepta os domínios brutos do S3 no DOM do Chat e os substitui pelo domínio correto da CDN antes que o navegador tente baixá-los. Isso roteia o tráfego corretamente e tapa o vazamento de banda. Adaptei-o para funcionar com qualquer armazenamento de objetos compatível com S3. São apenas duas configurações — URL bruta do bucket S3 e URL da CDN S3.

(não sei por que os oneboxes do GitHub estão quebrados aqui) Corrigido agora

2 curtidas

Provavelmente relacionado à mudança do site… Acabei de refazer o bake.

1 curtida