神秘的回声 - 找不到原因

时间:2013-01-17 14:45:58

标签: php echo

所以我制作了这个上传脚本并使其更安全,我找到了每个文件的类型。

但是,出于某种原因,文件类型正在回复给我! 例如:

  

图像/ 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>";
    }
}

谢谢!

2 个答案:

答案 0 :(得分:0)

我敢打赌die($style->upload_wrong_format())导致了这个问题。检查该功能。

答案 1 :(得分: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的身份证号码:

$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执行文件移动。它将保证是唯一的,而在某些时候你的代码将失败并踩踏另一个上传。

相关问题