Flask-上传到S3/Google云时是否需要使用secure_filename()?

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

在的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.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系统上,该函数还确保文件未被删除 以一个特殊设备文件命名