2016-07-07 31 views
6

Non mi è ancora chiaro quando utilizzare send_file e quando send_from_directory.Flask - Quando utilizzare send_file/send_from_directory

Ho un file protetto in una cartella. Posso accedere al file da entrambi i metodi. Quindi forse qualcuno ha un esempio che chiarisce quale funzione dovrebbe essere usata.

@app.route('/sfile/<id>') 
def sfile(id=None): 

    try: 
     return send_file('protected/'+id, attachment_filename='python.jpg') 
    except: 
     return('') 

@app.route('/sdir/<path:filename>') 
def sdir(filename): 
    try: 
     return send_from_directory(
      os.path.join(app.instance_path, ''), 
      filename 
     ) 
    except: 
     return '' 

risposta

11

send_file è la funzione che gestisce l'invio di file per l'utente. Non esegue alcun controllo di integrità sull'input, quindi invia anche volentieri protected/../../../etc/passwd o altro. Nel tuo caso specifico potrebbe non funzionare, ma se non sei a conoscenza di quel tipo di attacco potresti produrre codice non sicuro.

send_from_directory verifica che il file richiesto sia realmente dalla directory specificata. In questo modo l'attacco di cui sopra non avrebbe funzionato.

Quindi è possibile utilizzare send_file quando il percorso del file di input è attendibile. Ciò significa che esegui i tuoi assegni o se l'input è fornito da te (ad esempio, my_file_paths = {"a": "path/to/a", ... }; send_file(my_file_paths[user_input]) andrebbe bene) dovresti stare bene. Per il caso comune send_from_directory è una funzione di supporto che esegue i controlli di sicurezza appropriati.

+0

grazie mille per la spiegazione – Alex