0

ユーザーがさまざまなファイルをアップロードできるアプリケーションがありますが、テキスト表現をプレーンテキストとして安全に表示できるかどうかを各ファイルについて知る必要があります。

python-magic likeの使用

m = Magic(mime=True).from_buffer(cgi.FieldStorage.file.read())

正しい MIME タイプを教えてくれます。

しかし、スクリプトの MIME タイプが である場合もあるapplication/*ため、単に検索するだけでは十分でm.startswith('text/')はありません。

使用を提案した別のサイト

m = Magic().from_buffer(cgi.FieldStorage.file.read())

をチェックし'text' in mます。

2 番目のアプローチは、任意のファイル アップロードのコレクションに対して十分に信頼できるでしょうか、それとも誰かが別のアイデアを教えてくれますか?

どうもありがとう。

4

2 に答える 2

1

あなたの目標は何ですか?あなたは本当のmimeタイプが欲しいですか?これはセキュリティ上の理由から重要ですか?それとも「持っていてよかった」ですか?

問題は、同じファイルが異なるmimeタイプを持つ可能性があることです。スクリプトファイルに適切な#!ヘッダーがある場合、python-magicはスクリプトタイプを判別して通知します。ヘッダーが欠落している場合は、text/plain取得できる最善の方法である可能性があります。

これは、(モジュールの名前にもかかわらず)一般的な「常に機能する」魔法の解決策がないことを意味します。あなたは座って、あなたが得ることができる情報、それが何を意味するのか、そしてあなたがそれをどのように扱いたいのかを考えなければならないでしょう。

安全な解決策は、受け入れるmimeタイプのリストを作成し、それらをチェックすることです。

allowed_mime_types = [ ... ]
if m in allowed_mime_types:

つまり、完全一致のみが受け入れられます。また、サーバーが何らかの理由で正しいmimeタイプを持たない有効なファイルを拒否することも意味します(ヘッダーがない、マジックがファイルを認識できなかった、リストにmimeタイプを記載し忘れた)。

言い換えれば、本当に気にしないのに、なぜファイルのmimeタイプをチェックするのですか?

[編集]あなたが言うとき

そのテキスト表現をプレーンテキストとして安全に表示できるかどうか、ファイルごとに知る必要があります。

そうすると、これは思ったほど簡単ではありません。まず、「テキスト」ファイルにはエンコードが保存されていないため、ユーザーがファイルを作成したときに使用したエンコードを知っておく必要があります。これは簡単な作業ではありません。これを行うにはヒューリスティックがありますが、ISO 8859-1や8859-15などのエンコーディングを使用すると問題が発生します(後者にはユーロ記号が付いています)。

これを修正するには、ユーザーにテキストファイルを特定のエンコーディングで保存するように強制するか(UTF-8現在は最良の選択です)、ユーザーがテキストを貼り付けるフォームを提供する必要があります。

フォームを使用すると、ユーザーはテキストが正しくエンコードされているかどうかを確認でき(画面に表示されます)、問題を修正でき、ブラウザーがUTF-8でエンコードされたテキストを送信することを確認できます。

それができない場合は、入力で0x20未満のバイトをチェックするしかありません。ただし\r\nとは例外です\t。これは、「これはテキストドキュメントですか」のかなり良いチェックです。

しかし、ユーザーがウムラウトを使用する場合(世界中で使用されているアプリケーションを作成する場合など)、ユーザー側で特定のエンコーディングを適用できない限り、このアプローチは最終的に失敗します(信頼できないため、おそらくできません。ユーザー)。

[EDIT2]実際のソースコードをチェックするためにこれが必要なので:ソースコードが「安全」であることを確認したい場合は、それを解析します。ほとんどの言語では、実際にコードを実行せずにコードを解析できます。それはあなたにいくつかの本当の情報を与えるでしょう(パーサーは何を探すべきかを知っているので)そしてあなたは野生の推測をする必要はないでしょう:-)

于 2012-08-14T07:52:58.387 に答える
0

Magic(mime_encoding=True)少し遊んだ後、結果を適切に使用できることがわかりました。

Dropboxフォルダーで簡単なスクリプトを実行し、結果をエンコードと拡張機能の両方でグループ化して、不規則性をチェックしました。

しかし、を探すことでかなり使いやすいように見え'binary' in encodingます。

頑張っていきたいと思いますが、ありがとうございました。

于 2012-08-14T08:01:45.730 に答える