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

您的代码中有一些非常讨厌的逻辑错误:

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)您正在使用exec()和调用file来确定 mimetypes。为什么?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 号和您在此处完成任务时,另一个脚本无法执行和完成。正确的方法是启动事务,将骨架记录插入数据库,检索其 auto_increment 主键,然后更新记录并使用该 ID 移动文件。它将保证是唯一的,而在某些时候您的代码将失败并在另一个上传时踩踏。

于 2013-01-17T15:41:58.060 回答
0

我敢打赌die($style->upload_wrong_format())是造成问题的原因。检查该功能。

于 2013-01-17T14:47:47.060 回答