我创建(利用脚本 ,并从堆栈一些帮助,并从朋友一些帮助,我知道PHP非常少)一个简单的页面为当地非盈利出版,人们可以上传照片。
我不是伟大的安全性(从无知,不是故意疏忽的基础上),但我已经采取了以下措施来保护这个页面:
•PHP脚本设置为只接受为.jpg,.png和.TIF上传文件;
•它保存表单内容的子文件夹设置了700的权限和子文件夹将其保存照片上传到了已设定在700权限;
•根据文档,我的主机具有以下配置,以确保只有.php文件运行为.PHP:
<FilesMatch \.php$>
SetHandler php52-fcgi
</FilesMatch>
•我已经把相关的.htaccess文件(主要和保存的内容)文件夹:
RemoveHandler .php
RemoveHandler .inc
RemoveHandler .pl
RemoveHandler .cgi
RemoveHandler .py
RemoveHandler .fcgi
一夜之间,然而,有人发现了这个测试页面,并提交似乎是完全良性的测试消息和小.JPG。 这是与非直观的URL,只有我和大约三其他人知道的私人测试页; 没有其他人发送该测试。
这显然有我担心有什么东西hinky怎么回事,我很担心,我不知道足够的安全性,以确保该页面是安全的。
有没有办法,我失去了一些东西明显?
当上传处理,你应该记住,你可以在$ _FILES数组中查找数据也可以伪造。 它的行驶通过HTTP所以它很容易给人图像/ JPG MIME用于为例可执行文件。
1-检查真正哑剧
PHP想出一些功能来检查文件的真实MIME。 对于您应该使用的FileInfo
$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic");
$filename = "/var/tmp/afile.jpg";
echo $finfo->file($filename);
2-检查图像的属性
你显然要上传只有形象,使接收到的文件必须有一个宽度和高度:
使用和getimagesize()来获取所有有关图像所需的信息。 如果返回false,该文件可能不是一个图片,你可以将它删除。 和getimagesize也可以给你一个MIME类型,但我不知道这是否是可以信任的。
2.5重新处理图像
正如user628405建议,重新处理与GD图像可能是做的更安全的事情。
$img = imagecreatefrompng('vulnerable.png');
imagepng($img, 'safe.png');
显然,这必须根据图像类型进行调整。 请参见PHP文档中的所有imagecreatefrom *。
3-上传文件夹,另外的什么你已经这样做:
请确保您上传的文件夹不可用从网络。 验证如果需要上传的文件,然后将其移动到另一文件夹,重命名文件。 这将防止黑客执行恶意文件(不能执行它,如果它不能由一个URL即可到达)。
延伸阅读: https://www.owasp.org/index.php/Unrestricted_File_Upload
不要依赖于从客户端,包括内容类型的任何数据!
不要在网站根目录保存上传的文件。 上传的文件应该是只能通过脚本访问,为更好地控制。
不要保存上传的文件与原来的文件名和扩展! 在检索数据库后存储这些数据。
您可以检查的MIME类型的文件,但只要不担心,因为你的PHP处理程序只能执行PHP文件和你正在做不保存在你的脚本上传.php文件的护理,你没有任何暴露安全漏洞。
这是有效的.php文件以及安装你的课程服务器上的任何其他服务器端脚本语言。
一个更好的想法是让你接受,以节省您的文件系统扩展的白色。
我会忽略的MIME类型和传入文件的文件扩展名。 这些可以伪造。
存储这些文件的目录,如果你走这途径。
确保该目录仅仅是图像(音乐),然后得到一个脚本通过查看文件格式将正确的扩展他们。
此外,还要确保该目录不能执行PHP(或其他任何东西)。
这将保证您的安全。