在我的网站上,我有一个页面,用户可以上传文件,以配合他们添加的新闻帖子。我允许他们上传一个图像和一个声音文件。如果他们不想添加文件,他们不必添加,或者如果他们想要,他们可以添加一个。我的问题是,我的脚本只工作,如果用户选择两个文件。如果他们没有选择,或者只有一个,那么脚本就会弹出"无效文件",因为它找不到一个没有被选中的文件。
我试着使用:
if (isset($_FILES['filetoupload1'])) {
if (($_FILES["filetoupload1"]["type"] == "image/gif")
|| ($_FILES["filetoupload1"]["type"] == "image/jpeg")
|| ($_FILES["filetoupload1"]["type"] == "image/pjpeg")
|| ($_FILES["filetoupload1"]["type"] == "image/png")
|| ($_FILES["filetoupload1"]["type"] == "image/jpg")
) {
if ($_FILES["filetoupload1"]["error"] > 0) {
echo "Return Code: " . $_FILES["filetoupload1"]["error"] . "<br />";
} else {
if (file_exists("media/" . $_FILES["filetoupload1"]["name"])) {
echo $_FILES["filetoupload1"]["name"] . " already exists. ";
}
move_uploaded_file(
$_FILES["filetoupload1"]["tmp_name"],
"media/" . $_FILES["filetoupload1"]["name"]
);
}
} else {
echo "Invalid file";
}
}
if (isset($_FILES['filetoupload2'])) {
if ($_FILES["filetoupload2"]["type"] == "audio/mp3") {
if ($_FILES["filetoupload2"]["error"] > 0) {
echo "Return Code: " . $_FILES["filetoupload2"]["error"] . "<br />";
} else {
if (file_exists("media/" . $_FILES["filetoupload2"]["name"])) {
echo $_FILES["filetoupload2"]["name"] . " already exists. ";
}
move_uploaded_file(
$_FILES["filetoupload2"]["tmp_name"],
"media/" . $_FILES["filetoupload2"]["name"]
);
}
} else {
echo "Invalid file";
}
}
然后
if((isset($_FILES['filetoupload1'])) && (isset($_FILES['filetoupload2']))) { }
。也就是说,它是这样做的:
if filetoupload1 isset then run upload script that filters images.
if filetoupload2 isset then run upload script that filters audio.
if filetoupload1 AND filetoupload2 isset then run both upload scripts.
我是这样设置的。以上应该允许文件上传的所有组合。对吧?但是它不起作用,所以……
现在我不知道该怎么办了。这是音频的上传脚本,图像的脚本几乎是一样的:
谁能告诉我我做错了什么?"I get the error: Invalid file"
这是正确的,因为你的代码就是这样做的。
$_FILES["filetoupload1"]["type"]
不为空。您的脚本使您的服务器容易受到恶意用户的攻击,可以践踏web服务器有权访问的任何文件:
$_FILES[...]['name'] - user supplied
$_FILES[...]['type'] - user supplied
你相信客户端已经为文件提供了适当的MIME类型,但是没有什么可以阻止某人伪造请求并上传"virus.exe"并将MIME类型设置为"image/jpeg"。此外,由于远程文件名在用户控制之下,它可以被恶意数据破坏。考虑:
$_FILES['picture']['type'] = 'image/gif'
$_FILES['picture']['name'] = 'remote_server_control.php'
根据你的脚本完全合法,因为mime类型是"正确的",但是你现在已经把用户提供的PHP脚本放在你的服务器上,他们可以完全控制你的站点和/或服务器。
永远不要相信$_FILES
数组中的数据。始终通过服务器端实用程序确定MIME类型。如果脚本只处理图像,那么使用getimagesize()
。同样,不要使用用户提供的文件名。使用服务器端确定的内容为文件命名,例如数据库auto_increment ID号。即使你的代码不允许覆盖现有的文件,只要想出一个新名字就可以了…新版远程接管脚本。
我建议你添加一个隐藏文本,这个隐藏将检查上传字段是否活跃,你使用javascript:
<html lang="en">
<head>
<meta charset="utf-8">
<style>
</style>
<script type="text/javascript">
function uploadForm()
{
var size = 0;
var x = document.forms["myForm"]["upload1"].value.length;
var y = document.forms["myForm"]["upload2"].value.length;
if (x > 0)
{
size = 3;
}
if (y > 0)
{
size += 2;
}
return size;
}
</script>
</head>
<body>
<form name="myForm" action="" method="GET" onsubmit="chose.value = uploadForm()">
<input type="file" name="upload1"><br>
<input type="file" name="upload2"><br>
<input type="hidden" name="chose" value=""><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
现在,当您收到表单时,您必须检查所选字段的值,如果为2,则表示图像字段不为空,3音频字段不为空,5都不为空:
<?php
switch($_GET["chose"])
{
case 2:
//
break;
case 3;
//
break;
case 5:
//
break;
default:
// here the user doesn't use any field
}
?>