2016-07-07 7 views
6

का उपयोग कब करें send_file और send_from_directory का उपयोग करने के लिए यह अभी भी स्पष्ट नहीं है।फ्लास्क - send_file/send_from_directory

मेरे पास एक फ़ोल्डर में एक फ़ाइल है। मैं दोनों विधियों से फ़ाइल का उपयोग कर सकते हैं। तो शायद किसी के पास एक उदाहरण है जो स्पष्ट करता है कि कौन सा फ़ंक्शन इस्तेमाल किया जाना चाहिए।

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

उत्तर

11

send_file समारोह है कि उपयोगकर्ता के लिए फ़ाइलों को भेजने संभालती है। यह इनपुट पर कोई सैनिटी चेक नहीं करता है, इसलिए यह खुशी से protected/../../../etc/passwd या जो कुछ भी भेज देगा। आपके विशिष्ट मामले में जो काम नहीं कर सकता है, लेकिन यदि आप उस प्रकार के हमले से अनजान हैं तो आप असुरक्षित कोड उत्पन्न कर सकते हैं।

send_from_directory अनुरोधित फ़ाइल वास्तव में निर्दिष्ट निर्देशिका से गीली जांचती है। इस तरह उपर्युक्त हमला काम नहीं करेगा।

तो आप इनपुट फ़ाइलपैथ पर भरोसा करते समय send_file का उपयोग कर सकते हैं। इसका मतलब है कि या तो अपने स्वयं के चेक करें या यदि इनपुट आपके द्वारा प्रदान किया जाता है (उदा। my_file_paths = {"a": "path/to/a", ... }; send_file(my_file_paths[user_input]) ठीक होगा) तो आपको ठीक होना चाहिए। सामान्य मामले के लिए send_from_directory एक सहायक कार्य है जो उपयुक्त सुरक्षा जांच करता है।

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद – Alex