Flask - 何时使用send_file / send_from_directory

时间:2016-07-07 18:37:13

标签: 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 ''

1 个答案:

答案 0 :(得分:27)

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是一个辅助函数,可以进行适当的安全检查。