我想创建文件共享平台,但php有一些关于它的错误。我只是使用fread来获取任何文件的文本(exe,pdf,docx,ppt and etc)
然后我创建具有随机名称和.txt
扩展名的文本文件。因此,当用户想要下载这个文件时,我创建了随机文件夹,在该文件夹里面我创建了文件,该文件具有用户想要下载的相同文本,然后我给出与用户上传的文件版本相同的扩展名并强制用户下载它。
但是当用户下载文件时,例如zip文件,然后如果用户想要打开,它说无法打开,因为不支持格式。当我尝试使用docx,pdfs,zips和那种文件(不是txt)时会发生这种情况,html,css,c文件)。
示例:我强制用户下载他上传的相同扩展名,例如,如果用户上传了zip文件,我用fread读取文本然后将此文本保存在db或文本文件中,然后如果用户想要下载该文件,我只是创建文件并给它拉链扩展,然后强制用户下载它,但是一旦用户上传这个文件然后如果用户想要打开它就失败了,但它应该打开zip文件因为这个内容文本文件与上传到服务器的用户完全相同
答案应包含:
1)为什么会这样?如何解决?
2)什么是理想的解决方案?
3)这样做是否安全?
答案 0 :(得分:0)
发生这种情况,因为Windows知道应用程序只是从扩展名打开文件。如果您将文件重命名为something.txt,则编辑器始终要打开它。
没有理想的解决方案。解决方案是在没有设置执行位的非公共可读目录中存储具有原始名称的文件(可能在某些独特部分以防止重复)。要访问该文件,您可以创建一个代理脚本,该脚本返回该文件并附加一个应该下载的标题(也许是原始文件名)。
当你实施它时,它是安全的。您当前的解决方案可能是安全的,我发布的解决方案可能是安全的 - 但不知道细节,您如何实施它,没有人知道,它是否真的安全。
答案 1 :(得分:0)
之所以发生这种情况,是因为您打开了像zip文件这样的二进制文件,并将其存储在文本文件中,然后再次使用zip扩展名进行流式处理。
理想的解决方案是使用100万个开源文件管理器中的一个,并提供经过验证的记录和大型开发人员社区。但是,如果由于某种原因您想要自己构建,请将文件保存在公用文件夹外的安全文件夹中。将路径存储在所选数据库中以及将向用户显示的公共路径中。根据请求,使用公共路径映射到私人路径并自行开始下载。
和你做的一样安全,但没有什么是100%安全的,所以如果你要存储敏感数据,请使用构建和记录良好的东西