【问题标题】:Secure PHP file Up- and Download with user supplied names使用用户提供的名称保护 PHP 文件的上传和下载
【发布时间】:2023-03-12 23:44:01
【问题描述】:

我正在编写一个文件转换器。因此,用户上传文件,例如test.txt 然后被转换并且下载链接被发送回给用户。出于安全考虑,我在上传文件后立即更改文件的名称,就像建议 here 一样。

Instead create files and folders with randomly generated names like fg3754jk3h

问题从下载开始。为了获得更好的用户体验,我希望可下载的文件与用户提供的文件具有相同的名称,而不是随机字符串。目前我在 Chrome 中也遇到了错误:

<Filename> is an unusual download and may be harmful.    [translated]

我认为这也可能是加密文件名的结果。

所以我的问题是:在没有任何安全问题的情况下将文件名更改回原始文件名的最佳方法是什么,或者我应该更好地对文件名进行严格验证?这会消除显示的错误消息吗?

【问题讨论】:

    标签: php file security download


    【解决方案1】:

    您可以在将文件返回给用户时提供原始文件名。 (请参阅Downloading a file with a different name to the stored name 了解一些方法)

    不使用原始名称存储文件的原则是为了避免恶意用户试图将一些他可以执行的脚本上传到您的服务器。您应该这样做,但您也应该将这些文件放在您的 Web 服务器无法访问的临时目录中。

    例如:

    1. 您的网络服务器指向/var/www
    2. 当您收到上传的文件时,将其存储在/var/uploads 而不是/var/www/uploads。这样,用户将永远无法访问该文件(至少从网络上)
    3. 您将原始文件名保存在数据库中
    4. 你还是应该生成一个随机的文件名,这样可以避免文件名冲突(很多人会上传他们的cute-cat.jpg图片),保持文件扩展名没有问题。例如:kr3242sd93fdsh.jpg
    5. 您为您的用户提供了一些端点,通过一些随机字符串下载文件(我建议您避免使用与命名文件相同的随机字符串):https://youserver.com/download?id=uoqq41jsak
    6. 在您的下载端点上,您在Content-Dispositionfilename 属性上定义原始文件名。

    【讨论】:

    • 如果用户想要下载多个文件,他们会在服务器上进行压缩,然后将压缩文件发回。如果我想保留原始名称,我应该如何处理 .zip 中的文件名?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多