2010-12-30 12 views
0

これはおそらく簡単な質問ですが、達成が難しいと感じています。PHPイメージギャラリー(アップロードの問題)

私はと呼ばれるPHPのクラス( "class.upload.php" コードは*を下回っている)がありますので、テストページで、それはそうようになる

<?php 
    $upload = new upload(); 
    $upload->upload_file(); 
?> 

を:

<?php 
    $upload = new upload(); 
    $upload->upload_file(); 
?> 


<form action="" method="post" enctype="multipart/form-data"> 
    <input type="file" id="real_upload" class="hide" name="file" /> 
    <input type="submit" id="real_submit" class="hide" value="Upload" /> 
</form> 

問題は、私は私がしたいこと、それは「ギャラリーのアップロード」セグメントを経た後に、このクラスは、ファイルをアップロードすることです、ウェブサイトの一部のために、このアップロードシステムを使用しています:

<?php 

    $mysql_link = mysql_connect("localhost", "", ""); 
     mysql_select_db("") or die("Could not select database"); 

     while($counter <= count($photos_uploaded)) { 
      if($photos_uploaded['size'][$counter] > 0) { 
       if(!array_key_exists($photos_uploaded['type'][$counter], $known_photo_types)) { 
        $result_final .= "File ".($counter+1)." is not a photo<br />"; 
       } 
       else { 
        mysql_query("INSERT INTO gallery_photos(`photo_filename`, `photo_caption`, `photo_category`) VALUES('0', '".addslashes($photo_caption[$counter])."', '".addslashes($_POST['category'])."')"); 
        $new_id = mysql_insert_id(); 
        $filetype = $photos_uploaded['type'][$counter]; 
        $extention = $known_photo_types[$filetype]; 
        $filename = $new_id.".".$extention; 

        mysql_query("UPDATE gallery_photos SET photo_filename='".addslashes($filename)."' WHERE photo_id='".addslashes($new_id)."'"); 
} 

    ?> 

私はこれにどのようにアプローチしますか?

おかげで、Keiran

アップロードクラスは、完全な妥協にサーバーを開いている

<?php 
class Upload { 
    //File Max Size: 
    protected $max_file_size = 5; 

    public function upload_file() { 
     //Check for upload request: 
     if(isset($_FILES['file'])) { 
      //Set File Information: 
      $file = array(
       'name' => $_FILES['file']['name'], 
       'type' => $_FILES['file']['type'], 
       'size' => $_FILES['file']['size'], 
       'temp' => $_FILES['file']['tmp_name'], 
       'error' => $_FILES['file']['error'] 
      ); 

      //Check if it is under the max size limit 
      if($file['size'] < ($this->max_file_size * 1048576)) { 

      //Filename: 
       $filename = strtolower($file['name']); 
       $filename = str_replace(" ","_",$filename); 

       //Check for a custom path location, if none exists it will load into a file associated directory 
       if (isset($_REQUEST['customPath'])) { 
        $path = 'uploads/'.$_REQUEST['customPath'].'/'; 
       } else { 
        $path = 'uploads/'.$file['type'].'/'; 
         if(!file_exists($path) && !is_dir($path)) { 
          mkdir($path, "511", true); 
         } 
       } 

       //Now lets more the file: 
       $move_file = move_uploaded_file($file['temp'], $path . $filename); 

       if($move_file) { 
        echo 'uploads/'.$filename; 
       } 
      } else { 
       echo 'Your file is too big to upload to our server.'; 
      } 
     } 
    } 
} 

?> 

答えて

1

class.upload.php。

  1. customPathフィールドはサニタイズせず、「どこにファイルを置くのですか」の一部として盲目的に使用します。悪意のあるユーザーは相対パスを入力することができ、スクリプトはアップロードされたファイルをサーバーに何でも書き込もうとします。
  2. ファイル名の衝突をチェックしないので、悪意のあるユーザーが脆弱性#1とこれを喜ばせることができますWebサーバーがアクセスできるファイルを上書きします。あなたのサーバーはrootとして実行されていませんが、カスタムパス../../../../../../../../../../etc/とアップロードされたファイル名passwdを考えてください。ウェブサーバーはユーザ提供のバージョン/etc/passwdを上書きします。
  3. $ _FILES配列内のsizeパラメータもユーザー提供であり、簡単に偽造することができます。悪意のあるユーザーがこのファイルを1に設定し、何百万ものファイルをアップロードすることができます。代わりにfilesize($_FILES['file']['tmp_name'])を使用して実際のファイルサイズを判断することをお勧めします。
  4. isset($_FILES['file'])を確認するだけでは、ファイルが実際にアップロードされたかどうかを判断するには不十分です。 fileのエントリは、アップロードが成功したかどうかに関係なく、フォーム内に<input type="file" name="file">が存在する場合はいつでも再作成されます。アップロードが成功したかどうかを確認するには、($_FILES['file']['error'] === UPLOAD_ERR_OK)をチェックする必要があります(エラー定数はhereとなります)
  5. $ _FILES配列のtype部分もユーザーが提供しています。悪意のあるユーザーがimage/jpegに設定しても、サーバーにnasty_virus_from_hell.exeをアップロードすることはできません。安全な方法で自分でMIMEタイプを判断するには、getimagesize()またはFileInfo()を使用する必要があります。
  6. addslashes()は、SQLクエリ挿入のためにデータをサニタイズする非常に貧弱な方法です。安全な方法ではありません.を使用してください。これは、MySQL独自のAPIを使用してサニタイズを行い、MySQLの安全性を保証しています。
+0

私が求めていたものではなく、挑戦的に修正する必要があるもの。本当にありがとう! –

関連する問題