Flask-上传到S3/Google云时是否需要使用secure_filename()?
在的Flask文档中,他们建议在存储文件之前使用Flask-上传到S3/Google云时是否需要使用secure_filename()?,flask,werkzeug,Flask,Werkzeug,在的Flask文档中,他们建议在存储文件之前使用secure\u filename()对文件名进行清理 下面是他们的例子: uploaded_file = request.files['file'] if uploaded_file: filename = secure_filename(uploaded_file.filename) # <<<< note the use of secure_filename() here file.save(os.pa
secure\u filename()
对文件名进行清理
下面是他们的例子:
uploaded_file = request.files['file']
if uploaded_file:
filename = secure_filename(uploaded_file.filename) # <<<< note the use of secure_filename() here
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('display_file',
filename=filename))
uploaded_file = request.files['file']
if uploaded_file:
file_uuid = uuid.uuid4()
file.save(os.path.join(app.config['UPLOAD_FOLDER'], file_uuid))
# Rest of code
在这种情况下,您是否需要先调用secure\u filename()
看起来,因为我(a)将文件内容读入字符串,然后(b)使用自己的文件名,所以我的用例不易受到目录遍历或恶意命令类型攻击(例如,。/../../../../../../home/username/.bashrc“
),但我不是100%确定。你是正确的
如果使用request.files['file'].filename
的值来构建文件系统的文件路径(例如作为os.path.join
的参数),则只需使用secure\u filename
函数
当您使用UUID作为文件名时,用户输入值将被忽略
即使没有S3,如果在本地文件系统上使用UUID作为文件路径的文件名段,也可以安全地不使用secure\u filename
。例如:
uploaded_file = request.files['file']
if uploaded_file:
filename = secure_filename(uploaded_file.filename) # <<<< note the use of secure_filename() here
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('display_file',
filename=filename))
uploaded_file = request.files['file']
if uploaded_file:
file_uuid = uuid.uuid4()
file.save(os.path.join(app.config['UPLOAD_FOLDER'], file_uuid))
# Rest of code
在任何一种情况下,您都需要将UUID存储在数据库中的某个位置。是否存储最初提供的request.files['file'].filename
值,这是您的选择
如果您希望用户在上传文件时看到文件的原始名称,这可能是有意义的。在这种情况下,通过secure\u filename
运行该值无疑是明智的,因此,在任何情况下,前端都不会向用户显示包含名为的文件的列表
还指出了一些其他功能:
传递一个文件名,它将返回一个安全版本。这
然后,文件名可以安全地存储在常规文件系统中并传递
to:func:os.path.join
。返回的文件名仅为ASCII字符串
最大限度的便携性。
在windows系统上,该函数还确保文件未被删除
以一个特殊设备文件命名