2017-01-06 4 views
4

データからJSONファイルを生成するスクリプトがあります。 ディレクトリからファイルを読み込んで、JSONファイルのみを取り出してDBに挿入する2番目のスクリプトがあります。PHPで生成されたJSONファイルにはアプリケーション/オクテットストリームのMIMEタイプがあります

問題は、2番目のスクリプトがために(私はそれはかなりのものにすることができるようapplication/octet-stream MIMEタイプを許可したくない私の生成されたファイルの代わりに、application/json

から「アプリケーション/オクテットストリーム」MIMEタイプを検出したということですセキュリティ上の理由:その2番目のスクリプトは、ディレクトリ内にすべてのjsonファイルをロードします(生成されたものだけでなく)。

ファイルのMIMEタイプを「設定」する必要はありますか?

ファイル生成コード

:JSONファイルの読み取り

if($r_handle = fopen($s_file_name, 'w+')){ 
    fwrite($r_handle, json_encode($o_datas, JSON_HEX_QUOT | JSON_HEX_TAG)); 
    fclose($r_handle); 
    return; 
} 

コード:

$o_finfo = finfo_open(FILEINFO_MIME_TYPE); 
$a_mimes =& get_mimes(); 
if(is_dir($s_dir) && $r_handle = opendir($s_dir)){ 
    while($s_file = readdir($r_handle)){ 
     $s_file_path = $s_dir.$s_file; 
     $s_mime  = finfo_file($o_finfo, $s_file_path); 
     if(!in_array($s_file, array('.', '..')) && in_array($s_mime, $a_mimes['json'])){ 
      // Some code 
     } 
    } 
} 
+3

いいえ、MIMEタイプを「設定」できません。 Finfoは可能な限り最高の推測*です。 "application/octet-stream"とはかなり "ダンノー、それは私が推測するファイル"を意味します。技術的な正解です... – deceze

+0

質問を理解していれば、PHPのファイルの 'header()'と 'fopen()'にcontent-typeを設定できますか? –

+0

@SteveKnau: 'header()'、 'fopen()'、 'fwrite()'、 'fclose()'を実行できますか? – VeZoul

答えて

0

fileinfo拡張子(file Unixコマンドのような同様のツールとしては)基本的に定義されたシグネチャを検索データベース(「マジック」と呼ばれます)に保存されます。私が間違っていない場合、PHPのマジックデータベースは現在拡張バイナリファイルにコンパイルされているため、あなたはそれを覗いてみることはできませんが、おそらくあなたのシステムに似たデータベースがあります。私はC:\Apache24\conf.magicでApacheのを持っており、これはJPEGのエントリです:0xffd8で始まる

# JPEG images 
0 beshort  0xffd8  image/jpeg 

ものは絵です。完了!

JPEG file in hex editor

私は形式に特に精通していないんだけど、それはJSONのためにも、していないようです。また、既に推測しているように、全体的なユーティリティは決してセキュリティ機能ではありません。ファイルに含まれる内容を把握するためのヘルパーツールです。たとえば、次のような場合は非常に便利です。損傷したディスクから拡張子のないファイルを回復しました。


MIMEタイプはクールです。 application/jsonを設定して、みんながJSONだと分かっています。簡単で簡単ですね。

  • ファイルシステム(それらの多くは、実際にMIMEタイプを前に発明さ)ストア多くのファイルの属性(名前、最終更新日、アクセス権、時にはアイコン...)ではなく、MIMEタイプ:2つだけ注意点があります。 (確かに、学術的なファイルシステムがあるかもしれませんが、FAT32、NTFS、ext4の場合はそうではありません...)。それは通常、貴重な情報を追加するものではありません。更新する必要があるもう1つのトークンで、特にポータブルではありません(あなたのファイルをサムドライブにコピーしてしまいます)。

  • これはまだセキュリティ機能ではありません。ファイルの内容を偽造できれば、MIMEタイプを偽造できないのはなぜですか?だから、


、あなたは何ができるのでしょうか?最良の選択肢は、まったく何もありません。

ファイルをJSONとして解析し、失敗したかどうかを検出します。あなたはとにかくそれをする必要があり、それはあなたがする必要があるすべてを教えてくれます。 JSONは単純なテキストデータです。たぶん大容量のファイルを防ぐためのチェックをいくつか追加してください(ファイルのアップロードでやり直してください)、$depthチェックを追加するだけです。

if (json_decode($s_file_path, true, 32)!==null || json_last_error()!==JSON_ERROR_NONE) { 
    // Valid JSON 
} 
関連する問題