我有一个文件上传脚本,可供公众使用(例如,不是封闭的工作环境),我对安全性感到担忧: 我想允许上传任何文件,每个文件都会上传到它自己的独特目录,显然,我无法控制人们上传恶意文件,但处理这些文件的最佳方法是什么?
我想到了:
完全删除扩展名,并且仅在提供要下载的文件时,将其原始扩展名返回给他们(因为所有文件名和位置都将保存在db中)
创建“safezone”以禁止在目录中运行多个扩展名。
禁止上传“不安全”的扩展程序。
当然问题是: 有太多“不安全”的文件扩展名来统计它们。 虽然它包含一些代码,但是可以将文件屏蔽为“安全”。 以及许多其他安全风险......所以...有什么建议吗?
答案 0 :(得分:4)
为了安全起见:
答案 1 :(得分:3)
如果您所做的只是作为文件存储,那么您在乎什么?你没有以任何方式执行文件或查看文件,是吗?
文件扩展名与文件的安全程度无关。
编辑:您真正要做的是将文件名与完整路径的校验和一起存储在数据库中。然后你的脚本将传递那个校验和,然后在你的数据库中查找,然后你会以某种方式返回文件。不要使用您的网络服务器来提供文件,否则(正如您在下面的评论中所说)您可能会意外地执行上传的PHP文件。
答案 2 :(得分:2)
只需将它们上传到文档根目录之外,并在需要时使用php文件提供它们
答案 3 :(得分:2)
要防止服务器端执行,请不要将它们放入Web可访问文件夹,而是使用脚本来处理发送文件。
即:
<?php
// TODO: acl related stuff
// TODO: Map request to file name
// Send the file as an attachment
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $givenFileName . '"');
readfile($realFileName);
答案 4 :(得分:1)
我认为您可以使用这种方式使其安全
1-不要将文件作为其名称上传(意味着您应该使用md5(rand().time().rand()) ;
更改文件名称
)
2-在字典中添加空白页面以进行上传,你可以添加.htaccess来拒绝所有你可以使用的阅读
要显示或下载图片的文件
3-如果允许使用 - >您可以使用php中的rename()
将字典重命名为其他名称
4-检查上传大小,并使用@include();
5- as @periklis说如果您可以将文件保存在文档根目录之外,这将有助于:)
6-在strtolower文件扩展后拒绝此扩展.php , .asp .pl .py .rb .htaccess