0

そこで、このアップロード スクリプトを作成し、より安全にするために、各ファイルの種類を調べています。

しかし、何らかの理由で、ファイルタイプがエコーバックされています! 例えば:

画像/jpeg; charset=binary SWF ファイルのみをアップロードしてください。

アップロードが成功した場合、エコーされた文字列は同じように見えます。

コード:

 <?php session_start();
defined('IN_SCRIPT') ? NULL : define('IN_SCRIPT', NULL);
require_once 'inc/db_connect.php';
require_once 'styles/import.php';
$style = new style_class(NULL);
if(!isset($_FILES['file']['tmp_name']) || empty($_FILES['file']['tmp_name'])) die($style->upload_no_parameter());

$filetype = system('file -bi '.$_FILES['file']['tmp_name']);
$filetype = explode(';', $filetype, 1);
if ($filetype[0] != 'application/x-shockwave-flash; charset=binary') die($style->upload_wrong_format());


$sha256 = hash_file("sha256", $_FILES['file']['tmp_name']);
$query = $db->prepare('SELECT id FROM swf WHERE hash = :hash');
$result = $query->execute(array(':hash'=>$sha256));

if ($query->rowCount() != 0) die($style->upload_duplicate());

$query = $db->query('SELECT * FROM swf ORDER BY id DESC LIMIT 1;');
$name = $query->fetch(PDO::FETCH_ASSOC);
$new_name = 'uploads/'.($name['id']+1).'.swf';

if(move_uploaded_file($_FILES['file']['tmp_name'], $new_name)) { 
    $query = $db->prepare('INSERT INTO swf (uploader, upload_time, hash) VALUES (:id, NOW(), :hash);');
    $query->execute(array(':id' => $_SESSION['id'], ':hash'=> $sha256));
    echo $style->upload_success();
    }
else
    echo $style->upload_fail();
?>

スクリプトがそのようなエコーを行う理由がわかりません...

ありがとうございました!

編集:

style_class は、私が最初に見た場所でした。このクラスには、主に HTML テキストを返す関数が含まれています。クラス全体がデータベースから自動生成されます。

ここでは、生成されたファイルから upload_* をコピーしているので、次のことがわかります。

class style_class{
    function upload_no_parameter(){
        echo "<b>All parameters must be set!</b>";
    }
    function upload_fail(){
        echo "<b>There was an error, please try again.</b>";
    }
    function upload_success(){
        echo "<b>Your SWF has been uploaded!</b>";
    }
    function upload_duplicate(){
        echo "<b>File already exists!</b>";
    }
    function upload_wrong_format(){
        echo "<b>Please upload only SWF files!</b>";
    }
}

ありがとうございました!

4

2 に答える 2

0

die($style->upload_wrong_format())問題を引き起こしているに違いない。その機能を確認してください。

于 2013-01-17T14:47:47.060 に答える
0

コードにいくつかの非常に厄介なロジック バグがあります。

1) ファイルのアップロードが成功したと仮定します。適切なエラー処理は次のようになります。

if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
   die("File upload failed with error code " . $_FILES['file']['error']);
}

ファイルのアップロードで他のフィールドをチェックすることは適切ではありません。アップロードが失敗した場合でも、これらのフィールドは存在し、データが入力される可能性があります。エラー コードは次の場所に記載されています: http://php.net/manual/en/features.file-upload.errors.php

2) MIME タイプを決定するために使用exec()および呼び出しを行っています。fileなんで?PHP には、finfoまさにこの目的のためのライブラリがあります: http://php.net/manual/en/book.fileinfo.php と同じマジック ナンバー ライブラリを使用しfile、動作するために exec() 呼び出しを必要としません。

3) あなたの swf の ID 番号を取得するための、非常に競争の激しいエラーが発生しやすい方法があります。

$query = $db->query('SELECT * FROM swf ORDER BY id DESC LIMIT 1;');
$name = $query->fetch(PDO::FETCH_ASSOC);
$new_name = 'uploads/'.($name['id']+1).'.swf';

この ID 番号を取得し、ここで問題を完了するまでの間、別のスクリプトを実行および完了できないということはありません。適切な方法は、トランザクションを開始し、スケルトン レコードを DB に挿入し、その auto_increment 主キーを取得してから、レコードを更新し、その ID でファイルを移動することです。一意であることが保証されますが、ある時点でコードが失敗し、別のアップロードで踏みつぶされます。

于 2013-01-17T15:41:58.060 に答える