0

現在、ユーザーは好きなようにファイルをアップロードできます。したがって、アップロードされたファイルには、スペースや文字などがß, ü含まれます。他のユーザーよりもこれらのファイルをダウンロードできます(URLの空白などを含む)。このように機能しますが、RFC1738-Uniform Resource Locator(URL)によると、英数字[a-zA-Z0-9]と一部の特殊/予約文字のみが許可されます。また、空きスペースは避けるべきだと思います。

現在、サーバー上のファイル名にßaが含まれています。ßファイルをダウンロードしたいユーザーは、MySQLデータベース(utf8_unicode_ci)から正しい文字(ß)を取得するため、サーバー上でファイルを見つけることができます。

  • ファイル名を処理する正しい方法は何ですか?
  • ファイル名をチェックしてアップロードを禁止する必要がありますか?
  • ユーザーのアップロード後にサーバー上のファイルの名前を変更する必要がありますか(たとえば、、、str_replace()... urlencode())?
4

2 に答える 2

1

ファイル名を処理する正しい方法は何ですか?

あなたはすでにそれらを扱っているようです。rawurlencode仕様に準拠するように、ファイル名をURLパラメータに入れる前にラップします。

ファイル名をチェックしてアップロードを禁止する必要がありますか?

いいえ、それはユーザーを困らせるだけです。

ユーザーのアップロード後にサーバー上のファイルの名前を変更する必要がありますか?

これは良い考えかもしれません。選択した手法で「ランダム」な名前を生成し、「元の」名前をデータベースに保存できます。ユーザーがファイルをダウンロードしたいときはいつでも、Content-DispositionHTTPヘッダーを介してファイルをアップロードするために使用した名前でファイルをユーザーに返します。

これを行うことの利点には、各ユーザーのファイルシステムとサーバーのファイルシステムの微妙な違いに噛まれないようにすることと、ファイル名の重複の問題を回避することが含まれます。

于 2012-04-17T11:04:13.467 に答える
1

Webサーバーがファイルのダウンロードの処理を処理する限り、ファイルシステムのエンコーディングを認識し、ファイルシステムが処理するアップロードのファイル名に使用する文字セットと互換性があることを確認してください。

ここですべてに互換性がある限り(UTF-8を使用しているように見えます)、問題が発生することはありません。使用するすべての場所(ファイルシステム、Webサーバー、データベースサーバー、データベースクライアント接続、ブラウザー、POST要求のアップロード、ファイルリンク提供HTTP HTML応答など)でエンコードが正しく設定されていることを確認してください。

PHPでContent-Dispositionヘッダーを使用してファイルを提供する場合は、file-names内でfollowinig文字のみを許可する必要があります。

a-z, A-Z, 0-9, _, - , .

これは、そのヘッダーにUS-ASCII印刷可能範囲外の文字の有効な仕様がないためです。

通常、ファイルがアップロードされると、ファイル名は正規化されます。アップロードの時点で検証/サニタイズを行うことも賢明です。

于 2012-04-17T11:28:14.510 に答える