5

次のコードを使用して、アップロードされたファイルの一意のファイル名を生成しています

$date = date( 'U' );
$user = $_SERVER[REMOTE_ADDR];
$filename = md5($date.$user);

問題は、スクリプトの後半でこのファイル名を再度使用したいのですが、スクリプトの実行に1秒かかる場合、この変数を2回目に使用しようとすると別のファイル名を取得することになります。

たとえば、画像のアップロード/サイズ変更/保存のアップロードスクリプトを使用しています。スクリプトの最初の操作は、サイズ変更された画像をコピーして保存することです。これには、日付関数を使用して一意の名前を割り当てます。次に、スクリプトは保存を処理し、アップロード全体を保存して、名前を割り当てます。スクリプトの最後($thumbおよび$full変数)で、アップロードを保存したときに使用したファイル名をMySQLデータベースに挿入する必要があります。

問題は、大きな画像では1秒以上かかる場合があり(または処理中に秒が変わる)、ファイルが実際に保存されているファイル名とは異なるファイル名がデータベースに入れられることです。

これは、この命名方法を使用するのは良い考えではありませんか?

4

6 に答える 6

5

AFAIKは、ファイルに名前を付けるのに最適な方法ですがfile_exists()、乱数を確認して追加することもできます。

毎回アルゴリズムに依存するのではなく、そのファイル名を変数に格納し、後で再度参照する必要があります。これは$_SESSION、ページの読み込みの間にユーザー、Cookie、GET変数などに保存できます。

お役に立てば幸い

于 2009-08-11T17:24:39.107 に答える
2

(AIに従って)セッションにファイル名を保存することをお勧めします。他の変数の1つに保存すると、エンドユーザーがそれを介してシステムを攻撃できる可能性が高くなります。rand()と連結されたユーザーのMD5は、一意の値の長いリストを取得するための優れた方法です。rand()を使用するだけで、競合の割合が高くなる可能性があります。

ファイルをアップロードするために実行しているプロセスについてはわかりませんが、ファイルのアップロードを処理する別の方法は、PHPの組み込みハンドラーを使用することです。ファイルをアップロードしてから、「安全な」方法を使用して、アップロードされたファイルを一時スペースから引き出すことができます。(この場合の一時スペースは、改ざんを防ぐために、open base dirディレクティブの外側に安全に配置できます)。is_uploaded_file()およびmove_uploaded_file()from:http ://php.net/manual/en/features.file-upload.post-method.php例2は、発生している問題を処理する場合があります。

その場でファイル名を選択する場合は、その場所にある既存のファイルを確実に確認してください。ユーザー入力が何らかの形や形式で許可されている場合は、引数を検証およびフィルタリングして、安全であることを確認してください。また、ストレージフォルダがWebアクセス可能である場合は、名前とおそらく拡張子も変更するようにしてください。誰かがコードをアップロードして実行できるようにしたくはありません。それは公式に悪い活動につながります。

于 2009-08-11T17:36:08.537 に答える
2

php には識別子を作成する関数があることを追加したいだけです: uniqid. 識別子の前に文字列を付けることもできます (おそらく日付?)。

ユーザーの入力とサーバー ヘッダーを常に検証してください。

于 2009-08-11T17:43:22.283 に答える
1

PHP には tempnam と呼ばれる組み込み関数があることを発見しました。競合状態も回避します。http://php.net/manual/en/function.tempnam.phpを参照してください。

于 2012-05-02T18:36:17.567 に答える
0

使ってみませんか

$filename = md5(rand());

これは、すべての場合でかなりユニークになります。そして、それが$filenameすでに存在していることがわかった場合は、もう一度呼び出すことができます。

于 2009-08-11T17:23:25.163 に答える
0

時間に依存する ID を使用することはお勧めできません。2 つの画像を同時にアップロードすると、後の画像が前の画像を上書きする可能性があります。uniqid()などの関数を確認する必要があります。ただし、このアップロード/サイズ変更/保存スクリプトが「シングル ユーザー」を意図している場合、これはそれほど大きな問題ではありません。

問題自体に。私があなたなら、計算されたファイル名を変数に保存し、その時点から変数を使用します。計算済みの計算は時間の無駄です。また、非常に大きな画像や複数の画像を一度にアップロードする場合、スクリプトは 20 秒もかかることがあります。1 秒ですべてを作成できるという事実に依存することはできません。

于 2009-08-11T23:30:55.110 に答える