Impedire agli anonimi di scaricare file incompatibili con CDN

Ho un sito in cui i file mp4 restituiscono 404.

Hanno authorized_extensions impostato su *. Il caricamento del file funziona correttamente. Lo vedo nel filesystem. I permessi sono corretti. file dice che è un file MP4. Il record in rails sembra a posto:

[1] pry(main)> u=Upload.find(196082)
=> #<Upload:0x00005601a1b56348
 id: 196082,
 user_id: 1,
 original_filename: "PXL_20220617_184736219.mp4",
 filesize: 9328093,
 width: nil,
 height: nil,
 url: "/uploads/default/original/3X/5/6/5679d94dfce852f780afa5fcb7f1a29d810cc8fc.mp4",
 created_at: Fri, 17 Jun 2022 18:53:41.130790000 UTC +00:00,
 updated_at: Fri, 17 Jun 2022 18:53:41.176664000 UTC +00:00,
 sha1: "5679d94dfce852f780afa5fcb7f1a29d810cc8fc",
 origin: nil,
 retain_hours: nil,
 extension: "mp4",
 thumbnail_width: nil,
 thumbnail_height: nil,
 etag: nil,
 secure: false,
 access_control_post_id: nil,
 original_sha1: nil,
 verification_status: 1,
 animated: nil,
 security_last_changed_at: nil,
 security_last_changed_reason: nil>

ma accedervi restituisce un 404. Ci sono state un paio di nuove funzionalità e correzioni di bug per gli mp4 di recente, ma ho appena eseguito un aggiornamento e non funziona ancora. Non so dove altro guardare.

Il problema è che la configurazione di nginx consente solo determinati tipi di file. Spostamento questo in bug.

In discourse.conf si trova questa sezione:

      # questo ci permette di bypassare rails
      location ~* \.(gif|png|jpg|jpeg|bmp|tif|tiff|ico|webp)$ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }

Ho aggiunto mp3 e mp4 ai tipi di file (dopo webp e gli mp4 ora funzionano) a discourse.conf all’interno del container. Vedo “bypass rails” in discourse_docker config/nginx.sample.conf. Non vedo come arrivi nel template all’interno di docker, quindi non so come capire quando è successo.

Hanno * per i tipi di file consentiti. Non so se ci sia qualche magia che permetterebbe agli mp3/mp4 di funzionare se fossero enumerati nelle impostazioni del sito, ma non vedo come potrebbe essere.

Ma il download dovrebbe funzionare se non bypassa anche Rails.

C’è un percorso per questo

get "uploads/:site/original/:tree:sha(.:extension)" => "uploads#show", constraints: { site: /\w+/, tree: /([a-z0-9]+\/)+/i, sha: /\h{40}/, extension: /[a-z0-9\._]+/i }

e il metodo show dovrebbe semplicemente inviare il file. La configurazione di nginx lo renderebbe solo più efficiente bypassando rails, ma questo non è un requisito.

Oh.. le estensioni autorizzate sono solo per l’autorizzazione dell’upload, non per i download (cioè, un’estensione non presente in questo elenco non dovrebbe impedire il download di un file).

Non riesco a riprodurlo sui test più recenti superati, quindi potresti volerlo spostare di nuovo in Support :wink:

EDIT Ho cercato il sito su Google e sembra che tu abbia altri problemi.

Ora, quando faccio semplicemente wget del file, funziona.

(EDIT 2 questo potrebbe essere perché hai aggiunto l’estensione mp4 alla configurazione di nginx? Comunque, per me funziona semplicemente senza problemi)

1 Mi Piace

Grazie! Ci darò un’occhiata per prima cosa. Suppongo che avrei dovuto provare la modalità provvisoria!

Sono piuttosto confuso da quel service worker.

Non è un bug.

Non capisco ancora quel messaggio di Service Worker, ma ho disattivato prevent_anons_from_downloading_files e ora funziona. Sembra che l’impostazione “prevent_anons” sia incompatibile con CDN?

Ma i caricamenti non vengono recuperati dalla CDN su quel sito? Fa solo riferimento a una posizione su www

1 Mi Piace

Allora sono ancora più confuso. Suppongo che quel post non sia stato ricotto dopo che la CDN è stata definita.

Ma https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/7909 viene caricato dalla CDN e la modifica dell’impostazione lo ha risolto.

Vedo anche un sacco di 404 nella console, ma è un sito standard a due container con solo questi plugin:

          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-akismet.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-chat-integration.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-cakeday.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-checklist.git
          - git clone https://github.com/discourse/discourse-canned-replies.git
          - git clone https://github.com/discourse/discourse-chat

E penso che tu stia guardando https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/8017 che recupera dalla CDN quando guardo, sia con accesso effettuato che senza.