使用用户提供的名称来安全地上传和下载PHP文件

时间:2019-07-14 14:34:19

标签: php file security download

我正在编程一个文件转换器。因此,用户上传了一个文件,例如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]

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

所以我的问题是:将文件名改回原始文件而又没有任何安全问题的最佳方法是什么?还是我应该对文件名进行严格验证?并且这将摆脱显示的错误消息吗?

1 个答案:

答案 0 :(得分:0)

将文件返回给用户时,您可以提供原始文件名。 (有关几种操作方法,请参见Downloading a file with a different name to the stored name

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

例如:

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