防止服务器

时间:2016-07-22 00:30:32

标签: php image mysqli md5

我有一个用户输入数据并上传图像的表单。如果使用md5散列的图像完全相同,将检查此图像。上传的每个图像都有自己的md5哈希码。如果用户决定上传与服务器上的图像完全相同的图像,则不会移动该图像。相反,在创建条目时,图像将从具有相同哈希码的不同条目继承该文件的名称。但是我的当前代码遇到了几个问题。例如,当用户第一次上传图像时,没有哈希码。我遇到的另一个问题是,即使我上传的图像具有相同的哈希码,图像的名称也会变为uniqid。它正在执行else块而不是if块。

这是我的代码:

PHP

if (isset($_POST["pageNum"], $_FILES["image"], $_POST["subtitle"], $_POST["text"]))
    {
        $page = $_POST["pageNum"];
        $url = $_SESSION["articleUrl"];
        $subtitle = filter_data($_POST["subtitle"]);
        $text = filter_data($_POST["text"]);

        $name = $_FILES["image"]["name"];
        $tempName = $_FILES["image"]["tmp_name"];

        $target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";

        $hash = md5_file($target_file);
        $resultHash = $db->query("SELECT * COUNT(*) FROM `Stories` WHERE hash = '$hash' LIMIT 1");

        if ($resultHash->num_rows > 0)
        {
            $row = $resultHash->fetch_array();
            $name = $row["image"];

        }

        else
        {
            if (@getimagesize($target_file) == true)
                    {
                        $ext = pathinfo($name, PATHINFO_EXTENSION);     
                        $name = basename($name, "." . $ext);
                        $name = $name . uniqid() . "." . $ext;
                        $target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";
                    }

            move_uploaded_file($tempName, $target_file);
        }

        $result = $db->query("SELECT * FROM Stories WHERE page = '$page' AND url = '$url'");

        if ($result->num_rows == 0)
        {
            $db->query("INSERT INTO `Stories` (`image`, `text`, `url`, `subtitle`, `page`, `hash`) VALUES ('$name', '$text', '$url', '$subtitle', '$page', '$hash')");
        }

        else
        {
            $db->query("UPDATE Stories SET image = '$name', text = '$text', url = '$url', subtitle = '$subtitle', page = '$page', hash = '$hash' WHERE url = '$url' AND page = '$page'");
        }

    }

1 个答案:

答案 0 :(得分:0)

下面的行是有问题的,因为如果$target_file已经存在,您将只获得哈希值。如果没有该名称的文件,则没有任何内容可以散列,并且您无法获得与数据库值进行比较的哈希值。

$target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";
$hash = md5_file($target_file);

第一行没用;去掉它。您应该计算新上传文件的哈希值,因为这需要与存储在数据库中的哈希值进行比较:

$hash = md5_file($tempName);

稍后,您还需要更改getimagesize检查以使用新上传的文件,因为这是需要处理的文件(我们将检查这是否是一个新的唯一文件):

if (getimagesize($tempName) == true)