Impossibile scaricare allegato js

Sto riscontrando esattamente lo stesso errore di questa domanda, ovvero: riesco a caricare file JS dopo averli abilitati nelle impostazioni, ma quando provo a scaricarli, l’URL nel browser cambia in quello del file JS e viene visualizzato il messaggio “La modifica desiderata è stata rifiutata”.

Ambiente:
Discourse Docker in esecuzione dietro Nginx (Nginx utilizza SSL)

Log del container Discourse:

    Started GET "p5ePkm5OoKveknnMjyArlS4PPwS.js" for 192.168.32.1 at 2021-02-22 05:48:52 +0000
    Processing by UploadsController#show_short as JS
      Parameters: {"base62"=>"p5ePkm5OoKveknnMjyArlS4PPwS", "extension"=>"js"}
    Sent file afcdf626f9db8d54a1fb5e8ebcab0ea214d9226a.js (2.2ms)
    Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.
    Completed 422 Unprocessable Entity in 59ms (ActiveRecord: 0.0ms | Allocations: 17414)
    ActionController::InvalidCrossOriginRequest (Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.)
    /opt/bitnami/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.3.1/lib/action_controller/metal/request_forgery_protection.rb:266:in `verify_same_origin_request'

Log di Nginx:

    10.164.0.103 - - [22/Feb/2021:05:51:11 +0000] "GET /uploads/short-url/p5ePkm5OoKveknnMjyArlS4PPwS.js HTTP/2.0" 422 781 "getting-started-with-sftp-module/292" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"

Qualsiasi aiuto o indicazione è apprezzata!

2 Mi Piace

Stai permettendo l’aggiunta di file *.js ai post da parte degli utenti? Hai una reale necessità che gli utenti allegino file JavaScript? Voglio solo confermare con certezza prima di procedere oltre.

1 Mi Piace

Grazie per la risposta rapida!
Sì, si tratta di una discussione Q/A sulla programmazione, quindi allegare file di codice *.js è un caso d’uso legittimo.

2 Mi Piace

Ciao a tutti! Sto riscontrando lo stesso problema. Abbiamo consentito il caricamento di file con estensione .js, ma nessuno riesce a scaricarli. Non abbiamo ancora trovato alcuna impostazione per risolvere il problema. Qualcuno può aiutare?

1 Mi Piace

Puoi descrivere il caso d’uso? Perché è necessario?

Ciao Jeff,

Per ora, copiamo e incolliamo il codice nella sezione testuale del post.
Caso d’uso: abbiamo un file .js contenente un codice di Kickstarter o una soluzione a un problema ricorrente e vogliamo condividerlo come allegato, in modo che gli utenti possano scaricarlo e iniziare a utilizzarlo nei loro progetti.

Tuttavia, se cambiamo l’estensione del file da .js a .txt, compare di nuovo il messaggio “La modifica desiderata è stata rifiutata.” (Questo potrebbe essere dovuto a un’ottimizzazione dello storage sul backend: se il file ha lo stesso contenuto di un file precedente, il nuovo allegato punta al file già caricato).
Quindi, ho modificato leggermente il contenuto del file con estensione .txt (che in origine era .js) e l’ho ricaricato; sono riuscito a scaricare il file come allegato.

@codinghorror Esiste un rischio di sicurezza nel permettere il download di file .js?

1 Mi Piace

Sì; dovremmo fare alcune ricerche sui browser per assicurarci che il file venga sempre scaricato sul disco e mai eseguito.

1 Mi Piace

Abbiamo un forum per sviluppatori su fluiggers.com.br, dai un’occhiata… e spesso condividiamo file .js.

1 Mi Piace

Certo, ci sono molte problematiche di sicurezza legate all’abilitazione dei file js, quindi è qualcosa con cui dobbiamo avere estrema cautela.

L’intestazione Content-Disposition impedirà l’esecuzione dei file JS scaricati e la stiamo impostando correttamente:

attachment; filename="test.js"; filename*=UTF-8''test.js

Funziona per i caricamenti su S3 e dovrebbe funzionare anche per i caricamenti locali, ma sembra esserci una nuova misura di sicurezza (relativamente recente) di Rails:

ActionController::InvalidCrossOriginRequest (Avviso di sicurezza: un tag incorporato in un altro sito ha richiesto JavaScript protetto. Se sai cosa stai facendo, procedi e disabilita la protezione contro la falsificazione in questa azione per consentire l’incorporamento di JavaScript cross-origin.)

Dovrebbe essere risolvibile…

3 Mi Piace

Mi sono imbattuto nello stesso problema, abbiamo un forum di domande e risposte di codifica e dobbiamo essere in grado di condividere grandi file js per il download.

Ho lo stesso problema nella mia community. Le persone vorrebbero condividere file JS ma quando cercano di scaricarli, ricevono questo errore:

Estratto dal log di produzione di Rails:

Started GET "/uploads/short-url/qDlrltMxEIJ2aYYdt8lZ200E3wA.js" for 94.31.111.247 at 2025-07-09 05:53:30 +0000
Processing by UploadsController#show_short as JS
  Parameters: {"base62"=>"qDlrltMxEIJ2aYYdt8lZ200E3wA", "extension"=>"js"}
Sent file /var/www/discourse/public/uploads/default/original/1X/baab1fc131be960b601467333f5a690b257daeb0.js (0.3ms)
Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.
Completed 422 Unprocessable Entity in 17ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

i file js sono nell’elenco delle estensioni di caricamento consentite:

Stesso problema anche per noi. Abbiamo file js che vengono eseguiti nel nostro software, nulla che possa mai fare qualcosa in un browser.

Siamo riusciti a risolvere il problema di download di Discourse spostando tutti i caricamenti su un bucket S3 e impostando s3_use_cdn_url_for_all_uploads su true. Questo aggira essenzialmente il controller short-url che sembra essere l’ostacolo principale per i file js.

Nel dettaglio (dal mio AI che mi ha guidato in questo):

  1. Configurare l’archiviazione compatibile con S3 (ad esempio Cloudflare R2)

Discourse non può servire in modo sicuro i file .js dal disco locale. Spostali in un bucket.

  • Bucket: Crea un bucket privato (ad esempio my-discourse-bucket).

  • Chiavi API: Genera una Access Key e una Secret Key.

2. Configurare un dominio CDN personalizzato

In Cloudflare (o nel tuo provider), collega un dominio personalizzato al tuo bucket (ad esempio cdn.example.com). Questo garantisce che i file vengano serviti come risorse statiche tramite un URL diretto, aggirando la “sentinella di sicurezza” di Discourse.

3. Aggiornare le impostazioni di Discourse

In Admin → Settings, configura i dettagli S3. Crucialmente, abilita quanto segue per assicurarti che Discourse non tenti di “firmare” gli URL con intestazioni temporanee che potrebbero rompere il funzionamento:

  • s3_use_cdn_url_for_all_uploads: Spunta questa casella (Questo è il passaggio più importante).

  • s3_cdn_url: Imposta su https://cdn.example.com.

  • s3_region: Usa us-east-1 (per compatibilità con R2).

4. Migrare i caricamenti esistenti (opzionale)

Nota: Questo NON ha funzionato per noi per motivi sconosciuti.

Per correggere i vecchi link nei post esistenti, entra nel tuo container ed esegui:

Bash

# Dentro /var/discourse
./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake

Spero che questo aiuti qualcuno.