2016-06-25 6 views
3

私は現在、cURL実行ファイルを使用して、mp4ファイルをPOSTメソッドを使用してPHPスクリプトにアップロードしようとしています。 PHPファイルでは、ファイル形式とすべての種類のものをチェックしています。 PHPファイルは次のとおりです:cURLファイルをPHPにアップロード

<?php 

$allowedExts = array("jpg", "jpeg", "gif", "png", "mp3", "mp4", "wma"); 
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 

if (($_FILES["file"]["type"] == "video/mp4") && ($_FILES["file"]["size"] < 2000000) && in_array($extension, $allowedExts)) { 
    if ($_FILES["file"]["error"] > 0) { 
     echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
    } else { 
     echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
     echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
     echo "Size: " . ($_FILES["file"]["size"]/1024) . " Kb<br />"; 
     echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 

     if (file_exists("upload/" . $_FILES["file"]["name"])) { 
      echo $_FILES["file"]["name"] . " already exists. "; 
     } else { 
      move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; 
     } 
    } 
} else { 
    echo "Invalid file"; 
} 
?> 

通常のHTMLフォームを使用してファイルをアップロードすると、正しく動作します。これは私が使用するHTMLフォームです:

<!DOCTYPE html> 

<head> 
    <title></title> 
</head> 

<body> 

    <form action="upload_file.php" method="post" enctype="multipart/form-data" name="uploadedfile"> 
     <label for="file"><span>Filename:</span></label> 
     <input type="file" name="file" id="file" /> 
     <br /> 
     <input type="submit" name="submit" value="Submit" /> 
    </form> 
</body> 
</html> 

しかし、私は今、このコマンドを使用してcURLのクライアントを使用して、それをしようとすると:

"カール-Fの[email protected] http://localhost:1337/upload_file.php"

それは、コンソールに "Invalid File"と表示されます。これは通常、ファイルがPHPでチェックしている属性と一致しないときに表示されます。

皆さん、私の問題を理解して助けてくれることを願っています! :)

はカールが型に任意の推測をしないとPOSTリクエストで自動的にそれを送信しませんのでご$_FILES["file"]["type"]チェックが失敗しているスティーブン・

+1

だから、デバッグを済ませましたか? &if($ _FILES ["file"] ["size"] <2000000)&& in_array($ file)拡張子、$ allowedExts)) 'が失敗しますか? – melpomene

+0

よくあることですが、HTMLフォームを使って同じファイルをアップロードすると正しく動作するので、通常はそれらのどれも失敗しません。 – GeeHopper

答えて

1

挨拶します。

これは簡単に偽装されているため、とにかく大きなチェックではありません。

しかし、あなたの例の作業を行うファイルのパラメータでコンテンツタイプを指定しようとする:(私はコメントを書きたいが、まだ評判を持っていない)

curl -F [email protected];type=video/mp4 http://localhost:1337/upload_file.php 
+0

それは働いて、ありがとう! :) "簡単になりすまし"という言葉を聞いてもよろしいですか?つまり、このスクリプトを使用している間も、MP4ファイルをサーバにアップロードすることはできません。 – GeeHopper

+1

実際のファイルの内容がチェックされていないので、PHPを.mp4ファイルに入れてコンテンツタイプをスプーフィングし(上記のcURLリクエストのように)、アップロードすることができます。拡張のためにファイルをPHPコードとして実行することはまだ可能ではないかもしれません。 'curl -F [email protected]; type = whatever/i-want ...' =簡単になりすまし – drew010

+0

ああ、今はチップに感謝しています! :) – GeeHopper

1

さらに書いたものdrew010に、渡された値を信頼することは、実際にはセキュリティ上のリスクになる可能性があり、過去にサイトをハックするために使用されているので注意が必要です。

+0

チップをありがとうございますが、それはどういう意味ですか?人々はまだmp4ファイルをサーバにアップロードできないということですか? – GeeHopper

+1

さて、あなたも同様に役立つ拡張子をチェックしますが、OSや他のソフトウェアがファイルをどのように扱うかによって異なります。私は、画像/ png(画像/ *が許可されている)としてphpをアップロードしていると聞いていますが、画像アップロードディレクトリにPHPスクリプト(珍しいことではありません)があるようにサーバーも設定されています。 –

+1

しかしあなたの質問に答えるために、人々はサーバーに非mp4ファイルをアップロードできるので、そのリスクを評価したいと思うでしょう。 –

関連する問題