php - 安全图片上传 PHP

标签 php mysql file-upload

在我的网站上,我允许用户使用以下方式上传图片...

$max_filesize = 1572864; // 1.5MB
$upload_path = 'uploads'; 
$upload_path = $upload_path.'/';

$filename = $_FILES['profile_image']['name']; 


if(filesize($_FILES['profile_image']['tmp_name']) > $max_filesize)
      die('The file you attempted to upload is too large.'); 
if(!is_writable($upload_path))
      die('permission errorrr!'); 

if(move_uploaded_file($_FILES['profile_image']['tmp_name'],$upload_path . $filename)){
    // TA DA!
}

我只是在输入了关于它的安全性以及如何使其更加安全的一些意见后,我问我已经设法将文件从 .png 文件更改为 .jpg 并上传它,所以理论上 .exe 可以被重命名和上传,如果是这样,如何应对?

最佳答案

Mime 类型不可信,因此,正如@yoeriboven 所说,您可以使用:

if (!getimagesize($_FILES['profile_image']['tmp_name'])){
    die('Not an image');
}

但您也可以不允许执行任何上传到您的上传文件夹的文件。您可以使用 .htaccess(假设您使用的是 Apache)执行以下操作:

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

为了帮助用户,您可以做的另一件小事是使用 HTML5 的 accept 属性:

<input type="file" name="file" accept="image/gif, image/jpeg" />

(很明显,上面的内容可以在客户端更改,因此不能依赖它)

关于php - 安全图片上传 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16938950/

相关文章:

javascript - 在 react-native 中通过 PUT 方法上传文件

php - 当我从 mysql 中的另一个表存储它的 id 时如何显示字段值

php - Codeigniter 使用 this->db->like() 获取一列

php - ajax更新mysql字段而不刷新页面

mysql - 大表查询优化(mysql)

php - Eloquent belongsToMany关系与非标准列名

php - 如何使用 php mysql 从一组重复名称中仅获取一个值

PHP - filter_id() 的用途是什么?

c# - 尝试移动时*有时*上传仍在使用的文件

permissions - 负载均衡服务器上的文件上传