使用PHP将图像文件上传到服务器的最安全方法是什么?

时间:2011-12-16 10:03:54

标签: php mysql image

我知道这个话题被广泛讨论。我已经完成了我的研究,并决定将图像文件存储到服务器而不是数据库作为blob文件。我遇到的问题是试图找出上传文件的最佳方法,将其存储在指定的文件夹中,然后将目的地存储在db..say ../ img / something.jpg中 - 我试过翻阅许多资源,但大多数资源缺少一些重要的步骤。

问题:

  1. 寻找上传img文件的安全方式
  2. 限制文件
  3. size将图像上传到目标文件
  4. 将目标文件存储为数据库中的文本
  5. 我正在使用PHP和MySQL。

3 个答案:

答案 0 :(得分:1)

不知道你的所有观点,但你真正需要关注的是

  • 检查文件扩展名。
    从文件名中提取并与允许的文件进行比较 由于一些奇怪的Apache行为,检查文件名只有一个点,或者至少它没有像name.html.jpg这样的名称也是一件好事。

  • 检查文件内容。最好的方法是从上传的图像中创建一个全新的图像。

  • 在使用DB时采取常规预防措施。

答案 1 :(得分:0)

在这里,您将了解您想要做的基本想法:

<?php
    $allowedTypes = array("image/jpg", "image/jpeg", "image/png");
    $maxSize = 3 * 1024 * 1024; // 3Mb

    $fileType = $_FILES["file"]["type"];
    $fileSize = $_FILES["file"]["size"];

    // check if there was an error
    if ($_FILES["file"]["error"] > 0)
    {
        die($_FILES["file"]["error"]);
    }

    // check if the filetype is valid
    if (!in_array($fileType, $allowedTypes))
    {
        die("Invalid file type: $fileType");
    }

    // check if the size doesn't exceed the limitations
    if ($fileSize > $maxSize)
    {
        die("The file was too big: $fileSize");
    }

    $name = $_FILES["file"]["name"];
    $tmpfile = $_FILES["file"]["tmp_name"];

    // check if the filename is valid
    if (preg_match("/[\w-]+\.(jpg|jpeg|png)$/", $name) != 1)
    {
        die("Invalid file name: $name");
    }

    // create unique name if needed

    $path = "/var/www/images/" . $name;

    move_uploaded_file($tmpfile, $path);

    // add the filepath to mysql
    mysql_connect("localhost", "username", "password");
    mysql_select_db("imagedb");
    mysql_query("INSERT INTO images (Location, Size) VALUES ('$path', '$size');");
?>

这是为了说明如何做到这一点。

答案 2 :(得分:-2)

阅读this

我个人会使用堆栈交换网站上使用的imgur