所以我制作了这个上传脚本并使其更安全,我找到了每个文件的类型。
但是,出于某种原因,文件类型正在回复给我! 例如:
图像/ 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>";
}
}
谢谢!
答案 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执行文件移动。它将保证是唯一的,而在某些时候你的代码将失败并踩踏另一个上传。