2016-07-07 27 views
6

Es ist immer noch nicht klar, wann ich send_file und send_from_directory verwenden soll.Flask - Wenn send_file/send_from_directory verwendet werden soll

Ich habe eine Datei in einem Ordner geschützt. Ich kann von beiden Methoden auf die Datei zugreifen. Vielleicht hat jemand ein Beispiel, das klarstellt, welche Funktion verwendet werden soll.

@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 '' 

Antwort

11

send_file ist die Funktion, die Dateien an den Benutzer übernimmt das Senden. Es überprüft die Eingabe nicht, also würde es auch gerne protected/../../../etc/passwd oder was auch immer senden. In Ihrem speziellen Fall funktioniert das möglicherweise nicht, aber wenn Sie diese Art von Angriff nicht kennen, können Sie unsicheren Code produzieren.

send_from_directory prüft, ob die angeforderte Datei wirklich aus dem angegebenen Verzeichnis stammt. Auf diese Weise würde der obige Angriff nicht funktionieren.

Sie können also send_file verwenden, wenn der Eingabedateipfad vertrauenswürdig ist. Das bedeutet entweder Ihre eigenen Schecks oder wenn die Eingabe von Ihnen zur Verfügung gestellt wird (z. B. my_file_paths = {"a": "path/to/a", ... }; send_file(my_file_paths[user_input]) wäre in Ordnung) sollten Sie in Ordnung sein. Für den gängigen Fall ist send_from_directory eine Hilfsfunktion, die die entsprechenden Sicherheitsüberprüfungen vornimmt.

+0

vielen Dank für die Erklärung – Alex

Verwandte Themen