2017-10-24 2 views
0

私はフォルダにPDFやJPG、JPEGファイルのいずれかをアップロードしようとしていますと、以下のようにコードは次のとおりです。PHPファイルのアップロードが常にファイルをアップロードする場合でも、エラー

//Get the uploaded file information 
if(!$_FILES['medreport']['error']) 
{ 
    $medreport = basename($_FILES['medreport']['name']); 
    $medreport_extn = substr($medreport, strrpos($medreport, '.') + 1);//get the file extension of the file 
    $medreport_size = $_FILES["medreport"]["size"]/1024;//size in KBs 
    $tmp_path = $_FILES["medreport"]["tmp_name"]; 
    $report_folder = "../reports/"; 

    //Settings 
    $max_allowed_file_size = 200; // size in KB 
    $allowed_extensions = array("jpg", "jpeg", "pdf"); 

    //Validations 
} 

if($medreport_size > $max_allowed_file_size) 
{ 
    $error[] = "Size of the report file should be less than $max_allowed_file_size KB"; 
} 

//Validate the file extension 
$allowed_ext = false; 
for($i=0; $i<sizeof($allowed_extensions); $i++) 
{ 
    if(strcasecmp($allowed_extensions[$i],$medreport_extn) == 0) 
    { 
     $allowed_ext = true; 
    } 
} 

if(!$allowed_ext) 
{ 
    $error[] = "The uploaded report file is not a supported file type. "."Only pdf, jpg and jpeg report file types are supported. "; 
} 

//replace filename with unixtime 
$unixtime =time(); 
$medreport = $unixtime.mt_rand(0,9).'.'.$medreport_extn; 

$report_path = $report_folder . $medreport; 
if(is_uploaded_file($tmp_path)) 
{ 
    if(!copy($tmp_path,$report_path)) 
    { 
     $error[] = 'Error while copying the uploaded report file'; 
    } 
} 

正しい拡張子を持つファイルをアップロードしようとしているときと、 size私はそれをアップロードすることができます。

しかし、大きすぎたり不正な形式のファイルをアップロードしようとすると、エラーメッセージが表示されますが、ファイルは常にフォルダにアップロードされます。

どうしてですか?どうしたら、私のコードに間違いがありますか?

方法は、私はそれが十分に安全ですか?

SetHandler none 
SetHandler default-handler 
Options -ExecCGI 
php_flag engine off 

ファイルは常にが私を混乱さアップロード:WWWデータおよび権限によって所有されているフォルダは、私は次のように実行可能ファイルを防ぐために、ファイルアップロードフォルダにすぎ.htaccessファイルを持っている755です。

+1

おそらく、ディレクトリは、権限マスク(75気圧)上の最初の2つの数字に相当する 'www-data www-data'(所有者とグループ)によって所有されています。あなたは* guest *ユーザがWebサーバ上の何にでもパーミッションを必要とすることはまずありませんので、ハイライトは強調しています。セキュリティリスクは実際にはWebサーバーが読み書きできるディレクトリを持つことにありますが、.htaccessファイルでそのディレクトリを軽減することになります。 – CD001

+1

PHPはサーバー上で動作するので、ファイルが大きすぎるかどうか、またはファイルがサーバー上の*になるまで、許可されていないファイルの種類を知ることはできません* - そう、 limitは 'upload_max_filesize'や' post_max_size'で設定されます。この場合、アップロードは中止されます。 – CD001

+0

*他人が何を意味するかによって異なります* httpを介して提供されるすべてのファイルはApacheによって送信されます - これはdir(したがってファイル)の所有者です。 SFTPでログインする人はすべて 'www-data'グループに入っていなければなりません。基本的に、* guest *ユーザー(つまり、ゲストに* guest *としてログインしているユーザー)の権限をWebサーバー上で提供する必要がある場合はありません。 – CD001

答えて

3

このエラーを使用して、続行する必要があるかどうかを確認しているわけではありません。

この:

if(is_uploaded_file($tmp_path)) 

のようなものであるべき:

if(count($error) === 0 && is_uploaded_file($tmp_path)) 

そして、あなたはすでにそれをやっていない場合は空の配列として開始時に、あなたの$error配列を初期化する必要があります。

+0

あなたは絶対に正しいです。私はエラー配列を初期化inddedしたが、私はカウント($エラー)=== 0の部分を見逃した。私を助けてくれてありがとう。私はそれを安全にしている方法ですか?より安全にするために何をする必要がありますか? – Pamela

関連する問題