通过php上传文件时的安全措施
我有一个文件上传脚本,可供公众使用(例如,不是封闭的工作环境),我担心安全性: 我想允许上传任何文件,每个文件都将上传到它自己的唯一目录,显然,我无法控制人们是否上传恶意文件,但处理这些文件的最佳方法是什么 我想到: 完全删除扩展名,并且仅当提供要下载的文件时,才将其原始扩展名还给它们(因为所有文件名和位置都将保存在db中) 创建“安全区域”以禁止在目录中运行多个扩展 不允许上传“不安全”的扩展 当然,问题是: 有太多的“不安全”文件扩展名,无法将其全部计算在内。 可以将文件屏蔽为“安全的”,尽管它包含一些代码。 还有很多其他的安全风险通过php上传文件时的安全措施,php,security,file-upload,Php,Security,File Upload,我有一个文件上传脚本,可供公众使用(例如,不是封闭的工作环境),我担心安全性: 我想允许上传任何文件,每个文件都将上传到它自己的唯一目录,显然,我无法控制人们是否上传恶意文件,但处理这些文件的最佳方法是什么 我想到: 完全删除扩展名,并且仅当提供要下载的文件时,才将其原始扩展名还给它们(因为所有文件名和位置都将保存在db中) 创建“安全区域”以禁止在目录中运行多个扩展 不允许上传“不安全”的扩展 当然,问题是: 有太多的“不安全”文件扩展名,无法将其全部计算在内。 可以将文件屏蔽为“安全的”,尽
所以。。。有什么建议吗?如果你所做的只是充当一个文件存储,你关心什么?你没有执行这些文件,也没有以任何方式查看它们,是吗 文件扩展名与文件的安全性无关
编辑:您真正要做的是将文件名与完整路径的校验和一起存储在数据库中。然后您的脚本将被传递该校验和,该校验和将在您的数据库中查找,然后您将以某种方式返回该文件。不要使用您的Web服务器提供文件,否则(正如您在下面的评论中所说)您可能会意外地执行上载的PHP文件。如果您所做的只是充当文件存储,您关心什么?你没有执行这些文件,也没有以任何方式查看它们,是吗 文件扩展名与文件的安全性无关 编辑:您真正要做的是将文件名与完整路径的校验和一起存储在数据库中。然后您的脚本将被传递该校验和,该校验和将在您的数据库中查找,然后您将以某种方式返回该文件。不要使用您的Web服务器提供文件,否则(正如您在下面的评论中所说)您可能会意外地执行上载的PHP文件。为了适当的安全:
只需在您的文档根目录外上传它们,并在请求时为它们提供一个php文件只需在您的文档根目录外上传它们,并在请求时为它们提供一个php文件为了防止服务器端执行,不要将它们放在可通过web访问的文件夹中,而是使用脚本来处理文件的发送 即:
为了防止服务器端执行,不要将它们放在可通过web访问的文件夹中,而是使用脚本来处理文件的发送
即:
我想你可以用这种方法来保证它的安全
1-不要将文件作为其名称上载(意味着您应该使用md5(rand().time().rand());
)
2-在字典中添加空页以便上载,您可以添加.htaccess以拒绝所有您可以使用的读取
要显示或下载图像的文件
3-如果允许使用->可以使用php中的rename()
将字典重命名为其他名称
4-检查上传大小,并使用@include()隐藏所有路径代码>
5-正如@periklis所说,如果您可以将文件保存在文档根目录之外,这将很有帮助:)
6-在您降低文件扩展名后,拒绝此扩展名.php、.asp.pl.py.rb.htaccess
,我认为您可以使用此方法使其安全
1-不要将文件作为其名称上载(意味着您应该使用md5(rand().time().rand());
)
2-在字典中添加空页以便上载,您可以添加.htaccess以拒绝所有您可以使用的读取
要显示或下载图像的文件
3-如果允许使用->可以使用php中的rename()
将字典重命名为其他名称
4-检查上传大小,并使用@include()隐藏所有路径
<?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);