安全的PHP文件上传
我正在尝试在我们的新网站上开发一个文件上传模块,允许您将任何文件上传到我们的服务器。上载的文件将上载到安全的PHP文件上传,php,apache,.htaccess,security,file-upload,Php,Apache,.htaccess,Security,File Upload,我正在尝试在我们的新网站上开发一个文件上传模块,允许您将任何文件上传到我们的服务器。上载的文件将上载到/files,其中包含以下.htaccess以防止用户执行.php文件: <Files *.*> ForceType applicaton/octet-stream </Files> ForceType应用程序/八位组流 这会触发浏览器下载窗口(至少在FF和Safari中是这样),但是否可以安全地假设该文件不会使用此方法在服务器上运行?如果没有,您将如何实施这样的解
/files
,其中包含以下.htaccess以防止用户执行.php文件:
<Files *.*>
ForceType applicaton/octet-stream
</Files>
ForceType应用程序/八位组流
这会触发浏览器下载窗口(至少在FF和Safari中是这样),但是否可以安全地假设该文件不会使用此方法在服务器上运行?如果没有,您将如何实施这样的解决方案 我认为最安全的做法是限制对目录的100%web访问,并使用类似于
download.php
的脚本,通过该脚本传递文件id,然后获取相应的文件并将其输出到浏览器。但是,我很确定你所拥有的一切都会起作用并且是安全的。我想你实际上想要的是:
<Directory /path/to/files>
SetHandler default-handler
</Directory>
SetHandler默认处理程序
您所拥有的可能在实践中起作用,因为默认情况下,服务器配置为不执行任何操作,除非明确要求这样做,但它并不能真正保证不会执行任何操作
ForceType
只是为静态文件设置内容类型(我不确定,但我怀疑它是否会影响可执行脚本)。我同意Paolo的观点,他的方法更安全。总有人利用你的PHP文件执行上传的文件的问题。坏例子:
include_once("/modules/".$_GET["module"].".php");
如果有人通过
module=../Files/exploit
附议Paolo的答案,请将文件目录移出可访问路径。然后可以使用PEAR的模块编写download.php脚本来提供文件
使用此方法假定文件不会在服务器上运行是否安全
有点,但这取决于配置中有哪些其他指令;也许还有其他规则允许PHP文件运行。如果启用PHP的唯一方法是在文件类型上键入PHP处理程序,那么应该停止PHP的执行
然而,停止PHP执行只是您担心的问题之一。如果人们上传包含活动内容的文件,如HTML或Flash — 即使文件类型说它是一个无辜的图像 — 他们可以通过跨站点脚本(XSS)控制站点上其他用户的会话。有关这方面的一些讨论,请参阅
“download.php”界面使用内容配置始终触发下载框,并将文件存储在非用户提供的文件名(如“1234.dat”)下,更安全。为了获得最大的安全性,您可以将包含上载文件的文件夹从一个单独的分区挂载,该分区没有exec标志。当内容处置:附件触发所有常用浏览器上的下载时,Opera、Safari、Konquer仍将在网站上下文中打开该文件夹,因此该文件可以访问会话cookie。