2012-04-17 9 views
0

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

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

  • ファイル名を扱う正しい方法は何ですか?
  • ファイル名を確認してアップロードを拒否する必要がありますか?
  • ユーザーのアップロード後にサーバー上のファイルの名前を変更する必要がありますか(たとえば、str_replace()urlencode()、...)?

答えて

1

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

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

あなたはContent-DispositionヘッダにPHPでファイルを提供する場合、あなたは唯一のファイル名内のfollowinig文字を許可する必要があります。そのヘッダは米国の外の文字のための作業仕様を持っていないためだ

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

-ASCII印刷可能範囲。

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

+0

「ファイルシステムのエンコーディングとファイルシステムは、アップロードのファイル名に使用する文字セットと互換性があります」を調べるにはどうすればよいですか?はい、UTF-8を使用する必要があります。 WebサーバはApache、データベースサーバはMySQL 5.0.77、接続は 'SET NAMES utf8'で、ブラウザは誰でも、アップロードは' POST'と 'multipart/form-data'を介して行われ、HTMLのエンコーディングは' UTF-8 '。 Firebugでは、ファイルリンク提供のHTTP HTML応答は 'Content-Type \t application/x-www-form-urlencoded'ですが、何かをしたことがありません(デフォルト?)。 – testing

+0

だから 'Content-Disposition'は私が望むものではありません。ファイル名はどのように正規化され、検証されますか? – testing

+0

@testing:あなたは文字列処理でそれを自分で行います。 – hakre

1

ファイル名を扱う正しい方法は何ですか?

あなたはすでにそれはそうそれらを処理しています。 rawurlencodeにファイル名をラップしてから、それらをURLパラメータに入れて仕様に準拠させるようにしてください。

私は、ファイル名のチェックを行い、アップロードを禁止すべきか?

いいえ、それだけでユーザーを困らせるために役立つであろう。

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

これは良いアイデアすることができます。選択した手法で「ランダム」な名前を生成し、「元の」名前をデータベースに保存することができます。ユーザーがファイルをダウンロードしたい場合はいつでも、アップロードに使用した名前をContent-Disposition HTTPヘッダーに付けて戻します。これを行うための

利点は、各ユーザーのファイルシステムとサーバーと重複するファイル名の問題を回避するためのファイルシステム間の微妙な違いによって刺さないことが確実行うことを含みます。

+0

"あなたはすでにそれを扱っているようです"とはどういう意味ですか?私はそれらを別の場所に移動し、元のファイル名をデータベースに保存するだけです。コンテンツ処理はすべてのブラウザで機能しますか?英数字のみを使用するようユーザーに通知する必要がありますか?ランダムな名前の生成にはSEOには欠点がありますか?現在の状況はいつ問題につながるのだろうか(それはうまくいくが、なぜ)? – testing

関連する問題