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();
    }

エラーは「警告:unlink(/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 に答える