4

ユーザーが PHP Web サイトからファイルをアップロードできるようにしようとしています。すべてのファイルがサーバー上の 1 つのフォルダーに保存されるため、2 人の異なるユーザーがまったく同じ名前の 2 つのファイルをアップロードする可能性があります (可能性は低いとは言えますが)。または、まったく同じファイルである可能性があります。

exec("openssl md5 " . $file['upload']['tmp_name'])どちらの場合も、ファイルがアップロードされた直後にファイルの MD5 ハッシュを決定するために使用したいと思います。次に、データベースに同一の MD5 ハッシュがあるかどうかを確認します。見つかった場合は、アップロードを完了しません。

ただし、move_uploaded_fileドキュメントで、次のコメントを見つけました。

警告: データベースに md5_file ハッシュを保存してアップロードされたファイルの記録を保持する場合、これはユーザーが同じファイルを 2 回アップロードするのを防ぐのに役立ちます。また、ファイルが削除されたときに、対応するハッシュを見つけてデータベースで削除することはできません。

これは本当にそうですか?tmp ディレクトリ内のファイルの MD5 ハッシュは、永続的な場所に移動した後に変更されますか? なぜそうなるのか理解できません。それに関係なく、同じファイルがファイルシステムに複数回アップロードされないようにする別のより良い方法はありますか?

4

5 に答える 5

1

exec("openssl md5 " . $file['upload']['name'])代わりに名前を使用するべきではありませんか? 一時的な名前はアップロードごとに異なると思います。

于 2011-11-24T21:26:20.410 に答える
1

それは実際にそうであるように思われるでしょう。私はすぐにドキュメントにも目を通しています。しかし、使用する前に md5 チェックサムを共有し、move_uploaded_fileその値をデータベースに保存して、新しいファイルに直接リンクしないのはなぜですか? つまり、アップロードされたファイルと、そのファイルがファイルシステムに既に存在するかどうかをいつでも確認できます。

これにはデータベースが必要ですが、ほとんどの場合データベースにアクセスできます。

于 2011-11-24T21:28:46.450 に答える
1

ここで回答に示されているすべての理由に確信があり、md5 をまったく使用しないことに決めた場合 (ハッシュを使用したいのか、使用しなければならないのかまだわかりません)、各ユーザーに固有のものを追加するだけで済みます。各ファイル名へのアップロード時間。そうすれば、より読みやすいファイル名になります。次のようなもの: $filename = "$filename-$user_ip_string-$microtime";. もちろん、その前に 3 つの変数をすべて準備してフォーマットしておく必要があります。

同じファイル名、同じ IP アドレス、同じマイクロタイムが同時に発生する可能性はありませんよね? マイクロタイムだけでも簡単に回避できますが、IP を使用するとさらに確実になります。もちろん、私が言ったように、ハッシュを使用しないことに決め、より単純なソリューションを選択する場合、これはすべてうまくいきます.

于 2011-11-24T21:46:33.437 に答える
1

アップロードされたファイルの名前を一意の ID に変更してみてください。これを使って:

$dest_filename = $filename;
        if (RENAME_FILE) {
      $dest_filename = md5(uniqid(rand(), true)) . '.' . $file_ext;
         }

それが役立つかどうか教えてください:)

于 2012-12-04T22:41:10.650 に答える
0

いいえ、一般的にハッシュは move_uploaded_file によって魔法のように変更されません

ただし、ファイルのパスを含む md5() を計算すると、ファイルが新しいパス/フォルダーに移動すると、ハッシュは確実に変更されます。

ファイル名を md5() した場合、何も変わりません。

アップロードされたファイルの名前を一意の名前に変更することをお勧めします。

ただし、最終的にファイルを保存するファイルを見つけることを忘れないでください。これは、vHost のドキュメント ルート フォルダーの外にあります。そこにあり、PHP スクリプトを使用しないとダウンロードできません。

最後のコメント: 可能性は非常に低いですが、2 つの異なるファイルのmd5 ハッシュは同一である可能性があります

于 2011-11-24T21:32:00.937 に答える