如何使用PHP上传安全图片?

弗朗西斯科·罗梅罗(Francisco Romero)

我知道有很多问题,但是我无法解决所有我想知道的问题。

我想做的是允许网页的用户上传带有表单的图像。我想确保此过程安全,或者至少要尽我所能。

我对安全性的内在知识并不了解太多,但是我知道不安全的网页可能产生的所有后果。而且我不能安静地认为我的网页是不安全的,或者因为没有足够的访问量而不会有人进入我的网页(我是现实主义者)。

至此,我知道所有有关安全性的检查都必须在服务器端而不是客户端(或同时在两者)中进行。

我知道文件可以被当作图像来欺骗并运行恶意代码,因此我搜索了避免这种情况的方法。这是在将映像存储在服务器上之前可以找到的检查内容:

来自$_FILES

  • $_FILES['file']['name']:要检查我上传的文件是否具有名称。要知道该文件存在。
  • $_FILES['file']['error']:检查图像是否有错误。
  • $_FILES['file']['size']:检查图像尺寸是否大于0。
  • $_FILES['file']['type']:要检查文件类型是否为图像,但是不建议您这样做,因为PHP不检查它。

通用功能:

但是我的问题是我不知道我应该使用所有这些方法还是仅仅避免或添加其中的一些方法(因为其中某些方法似乎是多余的)。

我的问题是:

  • 我应该全部使用它们吗?
  • 我是否需要添加另一种方法以提高安全性?
  • 可以是我过滤文件评论器的顺序吗?我的意思是,最好先使用一个过滤器,反之亦然?如果是这样,顺序应该是什么,为什么?

注意:我不是在搜索个人意见。我试图收集所有可能的信息,但是我不确定这是否可行或是否在谈论安全性条款。如果您可以举一些被遗忘的事的例子,那就太好了。

提前致谢!

马丁先生

要回答您的问题:

  1. 您不需要使用所有这些方法,并且将使用哪种方法将基于个人意见。意思是说,有不止一种完全安全的方式来执行此操作,因此,如果您得到多个不同的答案,请不要感到惊讶。
  2. 请参阅以下示例,以了解您可能遗漏的其他检查
  3. 是的,顺序肯定很重要。

根据您的应用程序,任何安全上传的逻辑应如下所示:

用户登录了吗?(选修的)

// make sure user is logged in
if (!$user->loggedIn()) {
    // redirect
}

用户是否具有权限?(选修的)

// make sure user has permission
if (!$user->isAllowed()) {
    // redirect
}

表格提交了吗?

// make sure form was submitted
if ($_SERVER['REQUEST_METHOD'] == 'POST') {

表格输入有效吗?

// validate CSRF token
// ...

// make sure there were no form errors
if ($_FILES['file']['error'] == UPLOAD_ERR_OK) {

// make sure the file size is good
if ($_FILES['file']['size'] <= MAX_FILE_UPLOAD) {

// make sure we have a valid image type
$type = exif_imagetype($_FILES['file']['tmp_name']);
if ($type !== false) {

// make sure we check the type against a whitelist
if (in_array(ltrim(image_type_to_extension($type), '.'), array('jpeg', 'jpg', 'png'))) {

即使经过验证,也永远不要信任用户输入

// give the file a unique name
$hash = hash_file('sha1', $_FILES['file']['tmp_name']);
$ext = image_type_to_extension($type);
$fname = $hash . $ext;

保存文件(或选择使用库重新创建该文件以去除元数据),但永远不要保存在可公开访问的目录中

$upload_path = '/path/to/private/folder';
move_uploaded_file($_FILES['file']['tmp_name'], "$upload_path/$fname");

上面的步骤是绝对安全的,而且超出了合理范围,当然,始终存在应用程序或服务器的其他部分可能容易受到攻击的风险。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用PHP上传安全图片?

来自分类Dev

如何使用PHP上传图片?

来自分类Dev

如何使用angularjs php mysql上传图片

来自分类Dev

如何使用PHP上传图片之前检查/修复图片旋转

来自分类Dev

使用PHP上传多张图片

来自分类Dev

无法使用php上传图片

来自分类Dev

Volley使用PHP上传图片

来自分类Dev

如何使用PHP正确保护图片上传?

来自分类Dev

如何通过AJAX使用PHP获取上传的图片

来自分类Dev

如何使用json上传图片?

来自分类Dev

如何使用feathersjs上传图片?

来自分类Dev

如何使用http上传图片?

来自分类Dev

检查安全图片上传

来自分类Dev

如何在PHP中上传图片?

来自分类Dev

PHP如何更改上传图片的位置

来自分类Dev

如何在PHP中上传图片?

来自分类Dev

如何显示上传的图片。php , mysql

来自分类Dev

如何用html和php上传图片?

来自分类Dev

使用php上传图片时出错

来自分类Dev

使用PHP和MySQL上传图片

来自分类Dev

使用Ajax和PHP上传图片

来自分类Dev

Shopify API-使用PHP上传图片

来自分类Dev

如何使用JavaScript上传图片并使用它?

来自分类Dev

如何使用WordPress metabox上传多个图片?

来自分类Dev

如何使用Django Raw格式上传图片

来自分类Dev

如何使用jquery选择图片并上传?

来自分类Dev

如何使用httpPost上传几张图片?

来自分类Dev

如何使用Ajax上传多张图片?

来自分类Dev

如何使用Codeigniter上传多张图片?