0
require("$_SERVER[DOCUMENT_ROOT]mysql.php");
$id = $_GET["id"];
$result = mysql_query("SELECT * FROM Setting WHERE ID = \"$id\"");
$row = mysql_fetch_array($result);
switch ($_GET["action"])
{
    case "update":
    if (!unlink("$_SERVER[DOCUMENT_ROOT]setting/$row[Filename]"))
    {
        echo "Non è stato possibile cancellare il vecchio file.";
        header("Refresh: 2.5; url=index.php");
        exit();
    }

错误是“警告:取消链接(/web/htdocs/www.vhannibal.net/home/setting/):是第 43 行 [...] 中的目录”,第 43 行是

if (!unlink("$_SERVER[DOCUMENT_ROOT]setting/$row[Filename]"))

它出什么问题了?

4

3 回答 3

2

首先,您应该考虑回到基础并阅读输入验证。

忽略明显的 mysql 注入问题,unlink()只能在文件上调用。在您的代码中,您$row['Filename']不会在删除文件之前检查它是否是文件。

您至少可以检查文件是否存在

if (is_file("$_SERVER[DOCUMENT_ROOT]setting/{$row['Filename']}")) {
  //delete code
}
于 2011-03-29T10:14:21.707 回答
1

$row[Filename] 中没有任何数据或其空字符串。

于 2011-03-29T10:11:36.683 回答
0

由于仍然没有正确的答案,我必须自己写。

正如 Gaurav 指出的那样,您没有检查 mysql 查询是否返回任何数据
,因此您的代码应该是(但是,我会以更常用的方式编写字符串):

require($_SERVER['DOCUMENT_ROOT']."/mysql.php");
$sql = "SELECT * FROM Setting WHERE ID = ".intval($_GET["id"]);
$res = mysql_query() or trigger_error(mysql_error().$sql);
$row = mysql_fetch_array($result);

if ($row) // <-- here it is!
{
    switch ($_GET["action"])
    {
        case "update":
        if (!unlink($_SERVER['DOCUMENT_ROOT']."setting/".$row['Filename']))
        {
            echo "Non è stato possibile cancellare il vecchio file.";
            header("Refresh: 2.5; url=index.php");
            exit();
        }
    }
}
于 2011-03-29T11:08:23.053 回答