0

私はこれを何年もいじっていましたが、なぜそれが起こったのか理解できないようです-「PhpAcademy」チュートリアルに従っており、次のコードがあります(単にphpmyadminを使用して、 session): 問題は、ファイルを選択して [アップロード] をクリックすると、phpmyadmin の [imagelocation] の下に画像ファイルが表示されないことです。どんな助けでも大歓迎です。ありがとう!

アップロードプロセスを開始する「UPLOADPROFILEPIC.PHP」ファイル:

<?php

$_SESSION['username']="atestuser508";

$username = $_SESSION['username'];

echo "Welcome, ".$username."!<br/>";

if ($_POST['submit']) {
// get file attributes
$name = $_FILES['myfile']['name'];
$tmp_name = $_FILES['myfile']['tmp_name'];

if ($name)
{
    // start the upload process

    $location = "avatars/$name";
    move_uploaded_file($tmp_name,$location);

    $query = mysql_query("UPDATE members SET imagelocation='$location' WHERE username='$username'");

    die("You've successfully uploaded your profile pic! <a href='login-home.php'>Return to your profile</a>");
}
else
die("Please select a file to upload!");
}

echo "Upload a profile picture:

<form action='uploadprofilepic.php' method='POST' enctype='multipart/form-data'>
File: <input type='file' name='myfile'><input type='submit' name='submit' value='Upload!'>
</form>

";  
?>

ユーザーがアップロードしてプロフィール写真を表示できる「プロフィール」ページ:

<?php include("uploadprofilepic.php"); ?>
<?php
$query = mysql_query("SELECT * FROM members WHERE username='$username'");
if (mysql_num_rows($query)==0) 
die("User not found!");
else {
$row = mysql_fetch_assoc($query);
$location = $row['imagelocation'];

echo "<img src='$location'>";
}

?>

4

1 に答える 1

1

あなたのコードは、悪意のあるユーザーがサーバー上の任意の場所に好きなファイルをアップロードできるようにします。['name']パラメータが「安全」であることを盲目的に信頼しています。コードにはエラー処理がまったくなく、すべてがうまくいくと想定しています。

言い換えれば、あなたのサーバーには、少しでも興味を持った人なら誰でも海賊船が通り抜けることができる大きなセキュリティ ホールが開いたにすぎません。

最低限、次の方法でアップロードの成功を確認する必要があります。

if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    ... file was uploaded ok
} else {
    die("Upload failed with error code " . $_FILES['file']['error']);
}

ユーザーが提供するものは決して信用しないでください。ファイルのアップロードでは、a) ファイル名 ( ['name'])、b) ファイルの MIME タイプ ( ['type']) です。どちらも簡単に操作できます。

アップロードが成功したことを確認したら、「maliciousscript-that-gives-them-total-control.php」や「nasty_virus.exe」ではなく、実際に画像をアップロードしたことを確認する必要があります。

$info = getimagesize($_FILEs['file']['tmp_name']);
if ($info === FALSE) {
    die("You didn't upload a valid image type");
}

次に、このアップロード ファイルをサーバーに保存するためのファイル名には、ユーザーが指定した名前を絶対に使用しないでください。自分で生成します。この画像に関する詳細を「メンバー」テーブルに保存しているので、そのユーザーのメンバー ID を使用します (そのテーブルには主キーがありますよね?)。したがって、代わりに/site/images/userprovidedfilename.jpg作成します/site/images/37(ユーザーの ID が 37 であると仮定します)。

ファイルの移動が実際に成功することを確認します。

$status = move_uploaded_file($_FILEs['file']['tmp_name'], '/some/path/that/you/generated');
if ($status === FALSE) {
    die("Unable to move uploaded file to destination");
}

次に、データベースを更新し、クエリが実際に成功したことを確認します。

$sql = "...";
$result = mysql_query($sql);
if ($result === FALSE) {
   die(mysql_error());
}

これは、アップロード スクリプトをセキュリティで保護するために行うべき最低限の作業です。実行できることは他にもたくさんありますが、これにより、最も断固たる攻撃者以外からあなたを守ることができます。また、攻撃を受けていない場合でも、正当な理由で問題が発生した場合に、エラー処理が役立ちます。

于 2011-10-06T04:13:29.260 に答える