2017-06-24 10 views
1

私は、サーバーのセキュリティについて心配することなく、PHPスクリプトを介してファイルのアップロードとダウンロードを可能にする簡単で普遍的な方法を実装しようとしています。PHP:アップロードを安全にする簡単で普遍的な方法:乱数をXORする方法は?

これには多くの質問と回答がありますが、私が見たところでは、ファイル拡張子のチェック、MIMEタイプのチェック、保護されたディレクトリへの保存、ファイル名の変更、等)のそれぞれの欠陥および/または脆弱性を有する。

アップロードされたファイルごとにランダムな4バイト番号を作成し、そのファイルの内容をXORして(必要に応じて4バイトを繰り返して)php-upload-scriptを考えました。保存する前に4バイトをファイルに添付します。

ダウンロードするには、ファイルの4バイトをもう一度切り捨てる必要があります。コンテンツがXORされ、結果がクライアントに送信されます。

このようにして、私がサーバーに保存したファイルは実行可能でないか、またはアプリケーションに潜在的な意味があることを確信できます。さらに、ファイル名を格納するためにデータベースを追加する必要はありません。

セキュリティとパフォーマンスに関してこのソリューションについてどう思いますか? 私は、サーバー側のパフォーマンスと必要な処理能力について少し心配していますが、XORは一般的に高速でシンプルです。

答えて

0

誰かが興味を持っているなら、これは私が今使っているコードです。わたしにはできる。これまでのところ、それは私にとってかなり簡単な解決策のように見えます。 誰かがこれについて意見を持っているなら、私はまだ興味があります。

アップロード:

  <?php 
       $outputfilename = $_POST['filename']; 
       $inputfile = $_FILES["myblob"]["tmp_name"]; 
       $tempfilename="temp.tmp"; 

       if(move_uploaded_file($inputfile, $tempfilename)) { 
        $XORstring = random_bytes(4); 

        $tempfile=fopen($tempfilename, "r"); 
        $outputfile=fopen($outputfilename, "w+"); 
        flock($outputfilename, LOCK_EX); 

        fwrite($outputfilename, $XORbytes1); 

        while ($buffer = fread($tempfile, 4)) { 
         $buffer = $buffer^$XORstring; 
         fwrite($outputfilename, $buffer); 
        } 

        flock($outputfilename, LOCK_UN); 

        fclose($tempfile); 
        fclose($outputfile); 

        unlink($tempfilename); 
       } 

       exit(0); 
      ?> 

ダウンロード:

  <?php 
       $inputfilename = $_POST['filename']; 
       $tempfilename = "temp.tmp"; 

       $inputfile=fopen($inputfilename, "r"); 
       $tempfile=fopen($tempfilename, "w+"); 
       flock($tempfile, LOCK_EX); 

       $XORstring = fread($inputfile, 4); 

       while ($buffer = fread($inputfile, 4)) { 
        $buffer = $buffer^$XORstring; 
        fwrite($tempfile, $buffer); 
       } 

       flock($tempfile, LOCK_UN); 

       fclose($inputfile); 
       fclose($tempfile); 

       readfile($tempfile); 
       unlink($tempfile); 

       exit(0); 
      ?> 
関連する問題