Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP图像上传安全问题_Php_Security_Upload - Fatal编程技术网

PHP图像上传安全问题

PHP图像上传安全问题,php,security,upload,Php,Security,Upload,最近,我的网站上有一个表单上传了恶意代码,我一直有问题。此表单应仅允许上载图像。在阅读了一些内容之后,我实现了以下检查 对tmp上载的文件使用getimageresize()。如果返回false,则终止上载进程 chmod上传的图像到644,使其无法执行 上载的文件名被更改(前面有一个随机数),因此它与用户上载的文件名不完全相同 我读到在服务器端检查mime类型也是一个好主意。不过,我似乎无法访问服务器上的finfo_file()或mime_content_type() 这些听起来像是阻止恶意代

最近,我的网站上有一个表单上传了恶意代码,我一直有问题。此表单应仅允许上载图像。在阅读了一些内容之后,我实现了以下检查

  • 对tmp上载的文件使用getimageresize()。如果返回false,则终止上载进程

  • chmod上传的图像到644,使其无法执行

  • 上载的文件名被更改(前面有一个随机数),因此它与用户上载的文件名不完全相同

  • 我读到在服务器端检查mime类型也是一个好主意。不过,我似乎无法访问服务器上的finfo_file()或mime_content_type()

    这些听起来像是阻止恶意代码被上传和执行的好措施吗?我还应该采取其他措施吗?

    你的“1”对大多数人来说似乎已经足够好了,而且很可能是这样

    但是,如果您需要额外的安全性(恐怕会消耗更多内存),可以将图像保存在不可访问的文件夹中(docroot之外),然后编写一个简单的脚本来呈现文件。不过,这需要您将图像加载到内存中(PHP就是这么做的),所以我不建议您这样做,除非您真的担心有人会攻击您


    正如我所说的,你的第一个建议应该会奏效。而且,#3是没有用的,当你在DOM中插入图像时,你会用随机数公开新名称:)

    这是基于Eduard Luca所说的东西。我建议你

  • 确保您只接受有效的文件扩展名类型。这一点本身并不能拯救您,但如果有人上传
    .php
    文件,这一点将变得非常重要
  • 关闭上载目录的PHP处理。这样,您仍然可以直接显示图像,而PHP文件将出现403错误。这可以通过Apache中的站点配置完成

    <Directory "/path/to/upload">
    php_admin_flag engine off
    AllowOverride None
    DirectoryIndex Off
    RewriteEngine On
    RewriteRule \.php$ - [F,L] 
    </Directory>
    
    
    php_管理_标志引擎关闭
    不允许超限
    目录索引关闭
    重新启动发动机
    重写规则\.php$-[F,L]
    

  • 为什么不把它们上传到网络浏览器无法到达的地方呢?上传后,它们需要显示在网站上。我似乎无法通过我的电话访问webroot上面的内容。谢谢您的反馈。Re:chmod on the file(文件上的chmod)-这是否真的可以删除所有X位,这样,如果恶意文件真的构成了它,就没有人可以执行它了?老实说,我不知道有什么方法可以通过web服务器在远程服务器上运行文件,但是如果有,是的,chmoding应该是安全的。谢谢。对于如何检查非图像文件以确保它们不是恶意的,我仍然有点困惑。假设我必须允许上传PDF,我显然不能使用getimageresize()函数来验证文件。我唯一的想法是,您需要获取一个PDF库并调用其中一个方法,就像对图像使用
    getimagesize
    一样。如果该方法返回false,则它不是有效的PDF。噢#2非常有趣。。。这是在.htaccess文件中完成的吗?对不起,我对站点配置选项不是很了解。这会处理上传目录中的所有子目录吗,还是它们都必须单独完成?您绝对不能将
    php\u admin\u标志
    .htaccess
    一起使用。这是一个Apache级别的配置。