Come faccio a incorporare in modo sicuro un tag img utilizzando un URL fornito dall'utente?

8

Se ipoteticamente volessi consentire agli utenti di utilizzare un avatar da un URL arbitrario come questo:

<img class="avatar" src="{user input}" />

Ci sono molti problemi che posso pensare:

  • Ci sono data uris quindi potenzialmente è possibile creare un file PDF autonomo; questo funzionerebbe effettivamente all'interno di un tag <img /> ?
  • C'è la notazione javascript: che funziona con <a /> elementi
  • Un server può rispondere con autorizzazione non autorizzata e richiedere l'autenticazione di base 401, l'utente sarebbe tentato di provare la propria combinazione utente / password
  • Un server può restituire un'immagine umida

E probabilmente molto di più.

C'è un modo per renderlo sicuro senza effettivamente scaricare e servire quell'immagine?

    
posta siergiej 11.05.2015 - 15:41
fonte

1 risposta

4

Come evitare attacchi sul tuo sito

Devi convalidare che la stringa che hai ricevuto è valida. Ricorda questo principio: devi white-list stringhe accettabili piuttosto che black-list inaccettabili.

  1. Assicurati che la stringa sia un URL sintatticamente corretto e con caratteri di escape . Sfuggire all'intero URL evita di contenere "or > che potrebbe interrompere la sintassi del tuo sito.
  2. Assicurati che l'URL sia assoluto, per evitare attacchi di attraversamento di directory . Dovrai anche capire in che modo il tuo server web gestisce i link simbolici accessibili dalla tua cartella /var/www e come il tuo server risolve URL assoluti con riferimenti alle directory madri, ad es. www.server.com/../../../etc/passwd .
  3. Verifica che l'URL utilizzi un protocollo noto e supportato di cui comprendi le implicazioni: http o https . ¹

Protezione della privacy degli utenti

A priori non c'è alcun punto in cui controllare il vero significato del file perché può essere modificato in qualsiasi momento dall'utente che ha fornito il link senza che tu lo sappia. Se quel codice attiva un bug nella routine di rendering del browser, allora il processo del browser (in modalità sandbox) che renderà il tuo sito compromesso.

Devi essere consapevole che le immagini possono essere utilizzate per raccogliere gli indirizzi IP dei tuoi utenti. Gli aggressori devono solo aspettare e raccogliere quali indirizzi IP richiedono l'immagine che hanno usato per il tuo sito.

L'attacco 401 dovrebbe essere corretto, ma alcuni browser potrebbero ancora non gestirlo correttamente. È stato discusso in questo thread StackExchange . Come per questo thread di bug tracker di Chrome , Chrome non visualizza più un prompt di autorizzazione quando un'immagine innesca un errore 401.

Esiste una soluzione comune a queste due minacce: scarica e archivia l'immagine . Se puoi permetterti di farlo, avrai una maggiore certezza che gli utenti siano al sicuro. So che non è quello che stai chiedendo, ma è la tua migliore linea d'azione.

Evitare attacchi sul tuo server!

Poiché ora stai memorizzando nella cache l'immagine, devi cancellarla di nuovo bianca.

  1. Assicurati che l'immagine corrisponda a uno dei tuoi formati di file supportati (ad esempio PNG / SVG / JPG / GIF)
  2. Assicurati che l'immagine sia sintatticamente corretta
  3. Ricostituire le immagini estraendo qualsiasi informazione rilevante per visualizzarle e scaricando tutte le informazioni che non si riconoscono o necessarie, ad esempio Si presume che i file SVG incorporino JavaScript , che potresti non desiderare in quanto verrebbero eseguiti all'interno del tuo dominio dal browser. ²
  4. Imporre limiti ragionevoli alla risoluzione e alle dimensioni del file dell'immagine

¹ È stato sottolineato che un utente malintenzionato potrebbe fare qualcosa come file:///some/user/secret/on/their/local/machine . Se non hai recuperato il file ma hai lasciato l'URL così com'è, questo potrebbe causare il caricamento del file da parte del processo di rendering che esegue il rendering del tuo sito. In combinazione con un secondo URL di un'immagine che riesce a sfruttare un bug nel rendering, un utente malintenzionato potrebbe recuperare il contenuto di questo file.

² Nota che file SVG sono particolarmente pericolosi e che non ci sono strumenti disponibili per filtrale attualmente.

    
risposta data 11.05.2015 - 16:43
fonte

Leggi altre domande sui tag