1

ディレクトリを作成し、そのディレクトリにファイルをアップロードするphpスクリプトを設定しました。私の問題は、スクリプトを使用してディレクトリを作成すると、ファイルが完全にアップロードされないことです。別のホストでまったく同じスクリプトを実行したところ、アップロード プロセスは正常に機能しました。さらに、アップロード ディレクトリを手動で作成し、ftp 経由で chmod 777 を適用すると、転送は正常に機能します。機能が正しく動作するように変更する必要があるホスティングプロバイダーの設定のようなものはありますか?

アップロードフォームは次のとおりです。

<form action="/uploadFile.php" method="post"
enctype="multipart/form-data">
<label for="img_preview">Preview Image:</label>
<input type="file" name="img_preview" id="img_preview" />
<br />

<input type="hidden" name="id" value="newDirectory" />
<input type="submit" name="submit" value="Upload Flyer" />
</form>

ここに私のPHPスクリプト(uploadFile.php)があります:

$thisdir = getcwd(); 
$new_dir = $_POST['id'];
$full_dir = $thisdir . "/upload/" . $new_dir;

function chk_dir($full_dir) {
if(is_dir($full_dir)) {
    echo 'welcome back';
} else {
    return mkdir($full_dir);
}

}
chk_dir($full_dir);
chmod($full_dir, 0777);
?>

<?php
//upload image

if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["img_preview"]["error"] . "<br />";
  }
else
  {

  }
  //set image restrictions
?> 

<?php
if ((($_FILES["img_preview"]["type"] == "image/gif")
|| ($_FILES["img_preview"]["type"] == "image/jpeg")
|| ($_FILES["img_preview"]["type"] == "image/pjpeg"))
&& ($_FILES["img_preview"]["size"] < 80000))
  {
  if ($_FILES["img_preview"]["error"] > 0)
    {
echo "Please only upload an image for previewing (jpg or gif)...<br>
Also, check to         make     sure the filesize is less than 8MB" .          $_FILES["img_preview"]["error"] .     "<br />";
}
  else
{

//check the image into new directory
if (file_exists("upload/". $new_dir ."/". $_FILES["img_preview"]["name"]))
  {
  echo "It seems that " . $_FILES["img_preview"]["name"] . " already exists.";
  }
else
  {
  move_uploaded_file($_FILES["img_preview"]["tmp_name"],
  "upload/" . $_POST['id'] . "/" . $_FILES["img_preview"]["name"]);
  echo "image file has transferred successfully!";
      }
    }
  }
else
  {
  echo "Invalid file please contact for assistance.";
  }
?> 

また、スクリプトを実行してもエラーは発生せず、ファイルに「画像ファイルが正常に転送されました!」というメッセージが表示されます。しかし、新しい場所でファイルをチェックすると、完全に無効になります。この号をお読みいただきありがとうございます。

4

4 に答える 4

1

まず、スクリプトにセキュリティ ホールがあります。渡された $_POST データを使用してシステム ディレクトリを作成しないでください。そして、何にも0777を使用しないでください。

move_uploaded_file() は失敗時に false を返し、(コード内で) 失敗した場合でも成功メッセージが表示されます。

display_errors とエラー ログをオンにして、もう一度やり直してください。

于 2011-07-05T21:36:23.250 に答える
0

質問にはすでに回答が含まれているようです(FTP経由でディレクトリを作成するとアップロードが機能します)。

新しいサーバーではsafe_modeが有効になっていると思います。そのため、ファイル操作でファイル所有者のUIDを確認します。

何が起こるのですか:

  1. スクリプトがディレクトリを作成し、所有者がWebサーバーになります
  2. あなたのスクリプト(スクリプトの所有者は通常ftp-userです)はディレクトリをchmodしようとします

UIDが異なるため、script(owner:ftp)はディレクトリ(owner:webserver)をchmodできません。

解決策:ディレクトリの作成にはftp_mkdir()を使用します。

于 2011-07-06T00:35:10.233 に答える
0

これはあなたの質問に対する答えではないかもしれませんが、それでも注意する価値はあると思います. 経由で送信されたファイルのタイプに依存しないでください$_FILES。これは、私が覚えている限り、ブラウザから送信された MIME タイプにすぎません。簡単に侵害される可能性があります。関数を使用getimagesize()して、実際の画像タイプと高さ/幅を取得します。

ソース ファイル名についても同じことが言えますが、それによってセキュリティ ホールが生じることはありません。

于 2011-07-05T22:01:59.853 に答える
0

あなたはmove_uploaded_file()独立して使用しました。false を返すと、sucsessメッセージも出力されます。

試す

if ( move_uploaded_file($_FILES["img_preview"]["tmp_name"],
  "upload/" . $_POST['id'] . "/" . $_FILES["img_preview"]["name"])) {
echo "sucess";
}else{
echo "fail";
}

その後、主な問題は何かがわかります。print_r($_FILES)beforeによるデバッグポイントも使用します move_uploaded_file()

于 2011-07-05T21:53:23.740 に答える