如何在Python和Flask中清理用户提供的路径?

时间:2013-06-03 17:23:15

标签: python security web-applications flask user-input

我在Python / Flask Web应用程序中使用用户提供的名称作为路径组件:例如,用户创建一个名为“hello”的项目,提示我的Web应用程序创建一个名为“data / hello /”的文件夹存储用户将上传的文件。我想知道如何清理用户提供的名称,以便例如用户不能输入“../hello”并且在不同的目录中创建文件夹。我能提出的最好的基于路径名的解决方案是这样的:

import os.path
rpath = os.path.relpath(input_path)
safepath = rpath[rpath.index('../'):]

有没有更好的方法来确保我的网络应用无法访问data目录之外的文件?谢谢!

1 个答案:

答案 0 :(得分:5)

Werkzeug提供了secure_filename来帮助解决此问题,Flask docs

中提供了一个示例
@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename) #Sanitised here
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return redirect(url_for('uploaded_file',
                                    filename=filename))