2017-05-18 8 views
0


編集2:ユーザーは無制限のファイルをアップロードでき、すべてのディスク容量を取ることができます。
編集:誰もこの質問に答えなかったので、私の回答を得るために読めるソースがありますか?

PHPアップロードセキュリティ - ajaxアップロードで無制限のファイル形式をアップロードできないようにする

私はお問い合わせフォームを持っています。 3つの入力があります。私はファイルをアップロードするためにjQueryプラグインを使用しました。 Thisプラグインは別のフォーム要素を追加し、ajaxでファイルをアップロードします。
私は初心者ですが、このコードは顧客と実際の仕事のためのものですので、安全であることを確認したい!私の見解で


<form action="" method="post" enctype="multipart/form-data" > 
<input type="text" name="name" /> 
<input type="number" name="phone" /> 
<textarea name="enquiry" rows="10" ></textarea> 
<div id="upload-div"> 
<div id="extraupload">Upload</div> 
<input type="hidden" name="count" value="0" id="count"/> 
<input type="submit" /> 

$(document).ready(function() 
{ 
    var uploadObj = $("#extraupload").uploadFile({ 
     url:"/uplod_url", 
     fileName:"file", 
     onSuccess:function(files,data,xhr,pd) 
     { 
     data = jQuery.parseJSON(data); 
     if(data.status == 'success') { 
      var count = $('#count').val() * 1 + 1; 
      for(var i=0; i<data.files.length; i++) { 
      $('<input type="hidden" name="file_'+count+'" value="'+data.files[i]+'">').insertBefore('#extraupload'); 
      $('#count').val(count); 
      count++; 
      } 
     } 
     }, 
    }); 
}); 
</script> 

それぞれ成功したアップロードは、1 input countに値 を追加すると、アップロードされたファイル名の値を持つ非表示の入力を追加します。私は、ファイルの種類や変更、ファイル名をチェックし、PHPで

upload_url.php:

if ($_FILES['file']['type']=='image/jpeg' || $_FILES['file']['type']=='image/pjpeg') { 
    $ext = '.jpg'; 
} 
elseif ($_FILES['file']['type']=='image/png') { 
    $ext = '.png'; 
} 
elseif ($_FILES['file']['type']=='application/pdf') { 
    $ext = '.pdf'; 
} 
else { 
    echo json_encode('Only images and pdf files are allowed!'); 
    die(); 
} 
$fileName = md5(uniqid()); 
$fileName = $fileName.$ext; 
move_uploaded_file($_FILES["file"]["tmp_name"], 'image/tmp'.$fileName); 
$result = array('status'=> 'success','files' => $fileName); 
echo json_encode($result); 

一意のハッシュにファイルの名前を変更した後、私は、tmpフォルダ内にあることを保存します。メインフォームが送信されたときに

が、これは何が起こるかです:

//validation method: if that file exists in tmp folder 
if(isset($this->request->post['count']) && is_numeric($this->request->post['count'])) { 
    for($i=1; $i<=$this->request->post['count']; $i++) { 
     if(isset($this->request->post['file_'.$i])){ 
      if(!file_exists('image/tmp/'.$this->request->post['file_'.$i])){ 
       //throw error 
      } 
     } else{ 
      //throw error 
     }    
    } 
} 
// hidden input count can only be integer 
if(isset($this->request->post['count']) && !is_numeric($this->request->post['count'])) { 
    //throw error 
} 

し、ファイルを郵送し、データベース内のファイル名を保存し、私はそれは大丈夫だ一種の確信しているので、(私は、データベースの一部が含まれていませんでした)

//by every submition delete files in tmp folder older than 1 day 
$oldFiles = glob($tmp_dir."*"); 
$now = time(); 

foreach ($oldFiles as $oldFile) { 
    if (is_file($oldFile)) { 
     if ($now - filemtime($oldFile) >= 60 * 60 * 24) { 
      unlink($oldFile); 
     } 
    } 
} 

$mail = new Mail(); 
//Mail Setting and details deleted 

//if there's any file uploaded 
if($this->request->post['count'] != 0) { 
    //unique directory for every form submition 
    $dir_path = 'image/submitted/'.uniqid(); 
    mkdir($dir_path, 0764, true);    

    //for all hidden inputs move file from tmp folder to $dir_path 
    for ($i=1; $i <= $this->request->post['count']; $i++) { 
     $file = $this->request->post['file_'.$i]; 
     rename('image/tmp'.$file, $dir_path.'/'.$file); 
     $mail->AddAttachment($dir_path.'/'.$file); 
    } 
} 
$mail->send(); 

私の質問は:これは安全ですか?特に私はファイルの名前で隠された入力を追加し、隠された入力カウントからアップロードされたファイルの数を得るときは特に??
このコードはすでに動作していますが、これはセキュリティの問題である可能性があります。
ご迷惑をおかけして申し訳ありません。
PS:私はユーザがレンダリングされるユーザインターフェース(AJAXベースのWebページ)せずにサーバー側のスクリプトにアクセスすることができないと考えられるので、AJAXアプリケーションでは、より安全であることを一般的な誤解があり

答えて

0

opencart使用しています。 XML HTTPリクエストベースのWebアプリケーションはサーバー側のスクリプトをあいまいにしており、この不明瞭さはWebサイトの開発者や所有者に誤ったセキュリティ感覚を与えます。 XML HTTPリクエストはWeb上の他のすべてのプロトコル(HTTP)と同じプロトコルを使用して機能するため、技術的にはAJAXベースのWebアプリケーションは「通常の」アプリケーションと同じハッキング手法に脆弱です。

+0

あなたの答えはありがとうございます。どうすれば安全にすることができますか?私は編集で追加するユーザーは無制限のファイルをアップロードすることができます! – Niloofar

+0

私はあなたが手がかり[ここをクリック](http://stackoverflow.com/questions/256172/what-is-the-most-secure-method-for-uploading-a-file)を見つけることをお勧めします。 [ここをクリック](http://stackoverflow.com/questions/4950331/secure-php-file-upload-script) –

関連する問題