我有以下PHP代码
// Check if the upload is setted
if
(
isset($_FILES['file']['name']) && !empty($_FILES['file']['name']) &&
isset($_FILES['file']['type']) && !empty($_FILES['file']['type']) &&
isset($_FILES['file']['size']) && !empty($_FILES['file']['size'])
)
{
$UploadIsSetted = true;
$UploadIsBad = false;
$UploadExtension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
// Check if the upload is good
require "../xdata/php/website_config/website.php";
$RandomFoo = rand(1000999999,9999999999);
if (($_FILES["file"]["size"] < ($MaxAvatarPictureSize*1000000)))
{
if ($_FILES["file"]["error"] > 0)
{
$UploadIsBad = true;
$hrefs->item(0)->setAttribute("Error","true");
$hrefs->item(0)->setAttribute("SomethingWrong","true");
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],"../upload/tmp/".$RandomFoo.".file");
}
}
else
{
// The file is too big
$UploadIsBad = true;
$hrefs->item(0)->setAttribute("Error","true");
$hrefs->item(0)->setAttribute("UploadTooBig","true");
}
}
else
{
$UploadIsSetted = false;
}
$ZipFile = new ZipArchive;
$ZipFile->open('../upload/tmp/'.$LastFilename.'.zip',ZIPARCHIVE::CREATE);
$ZipFile->addFile('../upload/tmp/'.$RandomFoo.'.file',$RandomFoo.".".$UploadExtension);
$ZipFile->close();
现在我最大的担忧是用户可以上传任何东西,所以我该如何防止:
- 上传 2GB 3GB 文件
- 装卸
- 上传某种扭曲的漏洞,最终会改变我的服务器安全性
- 缓冲区溢出
- 具有任意代码注入的文件名
我的意思是,这个脚本有多安全?
我现在正在运行Windows,我将切换到Linux
四个其他问题:
装卸
这是复杂的部分。让我谷歌你一些想法:
- 防止 PHP 脚本被淹没
- 快速简便的防洪? - 使用随机数,时间+将其绑定到会话上
- 使用验证码,如果它不会对可用性造成太大损害。
上传某种扭曲的漏洞,最终会改变我的服务器 安全
使用命令行病毒扫描程序(f-prot
或clamav
)扫描上传的文件。您可能会在 PHP 本身中使用朴素的正则表达式扫描程序(例如,探测图像文件中的 HTMLish 内容),但这不是一个事实的安全功能;不要重新发明轮子。
缓冲区溢出
PHP 通常不容易受到缓冲区溢出的影响。
好吧,开玩笑。但是你在用户空间里什么也做不了。但是推动字符串并不是什么大问题。这在脚本语言中非常可靠且不可利用,只要您知道如何在哪种上下文中转义。
具有任意代码注入的文件名
在最激进的情况下,您应该始终使用basename()
来避免路径遍历漏洞。如果要保留用户指定的文件名,则需要正则表达式白名单。 =preg_replace('/[^'w's.]/', '', $fn)
粗略的例子。
您的行if (($_FILES["file"]["size"] < ($MaxAvatarPictureSize*1000000)))
已经将可接受的文件大小限制为 $MaxAvatarPictureSize
兆字节。尽管您提供的代码中似乎没有设置$MaxAvatarPictureSize
。我的猜测应该是 1 或 2 最大值。也没有设置是$LastFilename
,可能还有其他一些。
还要在压缩部分周围放置一个if($UploadIsBad === false) { /* do zipping */ }
,以避免压缩太大或无效的文件。