2016-07-07 65 views
6

send_filesend_from_directoryのどちらを使用するかはまだわかりません。Flask - 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入力ファイルパスが信頼できる場合は、send_fileを使用できます。つまり、あなた自身の小切手を行うか、入力があなたから提供されたかどうかを示します(例えば、my_file_paths = {"a": "path/to/a", ... }; send_file(my_file_paths[user_input])は問題ありません)。よくあるケースでは、send_from_directoryは、適切なセキュリティチェックを行うヘルパー関数です。

+0

ありがとうございました – Alex

関連する問題