0

*.cppソースファイルのアップロードを可能にする単純なPHPスクリプトを設計しています。基本的なセキュリティ対策として、一時ファイルを永続的な場所に移動する前に、一時ファイルのMIMEタイプを確認します。file --mime myfile.cppターミナル(Mac OS X)で実行すると、として表示されtext/x-cます。application/octet-streamそれでも、サーバーはそれを何らかの理由でと見なします。「/etc/mime.typescpp」拡張子にはtext/x-c++src、MacのMIMEタイプの問題であると私が信じるような拡張子があります。

Ubuntuから同じ手順を試しましたが、正常に動作します(として表示されますtext/x-c++src)。両方のコンピューターでChromeを使用しています。

それ自体はプログラミングの問題ではありませんが、これには私がよく知らないPHPのトリックがあるかもしれません。

$temp_file=$_FILES["file"]["type"];
if(($temp_file!="text/x-c++src")||($temp_file!="text/x-c")) {
    echo "<p style=\"color:red;font-style:italic\">Please upload a valid C++ file.</p>";
}
4

2 に答える 2

1

$_FILES['userfile']['type']ブラウザが(アップロード中に)送信した MIME タイプが含まれます。使うことはできますが、信頼することはできません。

$_FILES['userfile']['tmp_name']以下を使用して MIME タイプを取得してみてください。

$mime = mime_content_type($tmp_name);
// or, as this is deprecated:
$info = new finfo(FILEINFO_MIME_TYPE);
$mime = $info->file($tmp_name);

または、 の元のファイル名の拡張子から推測できますstrrchr($_FILES['userfile']['name'], '.')

于 2012-11-14T23:49:21.727 に答える
0

サーバーは、アップロードしたブラウザが言うタイプを認識します。

一般に、ブラウザはファイルの種類を判断するのが得意ではなく、悪意のあるアップローダーは常にそれをオーバーライドできます。

MIME タイプを信頼することはできません。ファイルの種類を合理的に確実に知りたい場合はfile、データを盗聴するなどのユーティリティを使用する必要があります。

于 2012-11-14T23:49:07.403 に答える