防止用户滥用图片删除脚本

时间:2011-05-03 17:43:54

标签: php

核心部分基本上如下:

$file = basename($_GET['f']);
$directory = "/var/www/site/";
$file = $directory . $file;
$hash = $_GET['h'];
$md5check = md5($file);
$md5check = substr($md5check, 0, 5);

if ($md5check == $hash) {
    if (file_exists($file)) {
        unlink($file);
    }
    else {
        die('error');
    }
}
else {
    header('Location: error');
    exit;
}

我意识到使用用户输入是在寻找麻烦,但我怎样才能让服务器“找到”要删除的文件?我能以某种方式逃脱注射吗? 用户将加载http://site.com/?f=test.jpg&h=hashc

除了MD5之外还有其他任何散列系统,它们对于文件的每个位置都是独立的吗?
例如。
file1.rar在凌晨12点下载= differenthash
    file1.rar在晚上11点下载= randomhash
file1.rar在两种情况下都是相同的文件。

与md5:
file1.rar在12:00 am = randomhash
下载     file1.rar在晚上11点下载= randomhash
file1.rar在两种情况下都是相同的文件。

2 个答案:

答案 0 :(得分:2)

您已经在使用basename,它应该极大地限制攻击向量(因为用户无法从其他目录中删除文件),但是让用户有权从/ var /中删除文件是非常糟糕的主意,因为用户也可以传递任何非图像文件。

你有没有相对于你的web根目录的路径而不是一个非常重要的系统目录?

额外的安全性可能包括(请注意,此列表并非详尽无遗......):

  1. 用户检查:检查Web服务器用户是否拥有用户请求删除的文件。
  2. 将上传的文件存储在数据库中,并检查它们是否存在并在允许删除之前由我们的脚本上传。
  3. 如上所述,将文件移出系统目录。
  4. 使用更强的散列(即盐!)。
  5. 将此限制为已登录用户并记录所有操作,如果有人试图删除已记录的文件并且您确切知道它是谁。

答案 1 :(得分:0)

正如@rudi_visser所说,最好的方法是白名单,并将上传的文件+数据存储在数据库中。 当用户尝试删除文件时,请确保它是他,并确保文件已上载(存在于“已上载”表中,而不是脚本/系统的一部分)。