我在Python / Flask Web应用程序中使用用户提供的名称作为路径组件:例如,用户创建一个名为“hello”的项目,提示我的Web应用程序创建一个名为“data / hello /”的文件夹存储用户将上传的文件。我想知道如何清理用户提供的名称,以便例如用户不能输入“../hello”并且在不同的目录中创建文件夹。我能提出的最好的基于路径名的解决方案是这样的:
import os.path
rpath = os.path.relpath(input_path)
safepath = rpath[rpath.index('../'):]
有没有更好的方法来确保我的网络应用无法访问data
目录之外的文件?谢谢!
答案 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))