您的位置:首页 > 其它

dede中上传图片文件失败的解决过程

2014-02-27 11:28 253 查看
有人找我说,DEDE做的网站被人黑了,到处都是乱七八糟的文件,他就升级补丁,把一些可疑的文件删除了。现在出现了图片不能上传的问题。

我测试了一下,上传图片后,提示“文件不存在”。处理图片上传的PHP是include/dialog/select_images_post.php,我在PHP里打印了相关的变量。发现$_FILES数组是空的。这个可能是PHP文件执行的问题,或者是上传目录权限的问题。 一般来说有提示信息,不会是文件执行权限的问题。那就是目录权限的问题了。

我用phpinfo()函数查看了upload_tmp_dir(临时文件上传目录),接下来就是测试目录的权限了。检测的函数如下:

/**
* 文件或目录权限检查函数
*
* @access          public
* @param           string  $file_path   文件路径
* @param           bool    $rename_prv  是否在检查修改权限时检查执行rename()函数的权限
*
* @return          int     返回值的取值范围为{0 <= x <= 15},每个值表示的含义可由四位二进制数组合推出。
*                          返回值在二进制计数法中,四位由高到低分别代表
*                          可执行rename()函数权限、可对文件追加内容权限、可写入文件权限、可读取文件权限。
*/
function file_mode_info($file_path)
{
/* 如果不存在,则不可读、不可写、不可改 */
if (!file_exists($file_path))
{
return false;
}
$mark = 0;
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
{
/* 测试文件 */
$test_file = $file_path . '/cf_test.txt';
/* 如果是目录 */
if (is_dir($file_path))
{
/* 检查目录是否可读 */
$dir = @opendir($file_path);
if ($dir === false)
{
return $mark; //如果目录打开失败,直接返回目录不可修改、不可写、不可读
}
if (@readdir($dir) !== false)
{
$mark ^= 1; //目录可读 001,目录不可读 000
}
@closedir($dir);
/* 检查目录是否可写 */
$fp = @fopen($test_file, 'wb');
if ($fp === false)
{
return $mark; //如果目录中的文件创建失败,返回不可写。
}
if (@fwrite($fp, 'directory access testing.') !== false)
{
$mark ^= 2; //目录可写可读011,目录可写不可读 010
}
@fclose($fp);
@unlink($test_file);
/* 检查目录是否可修改 */
$fp = @fopen($test_file, 'ab+');
if ($fp === false)
{
return $mark;
}
if (@fwrite($fp, "modify test.\r\n") !== false)
{
$mark ^= 4;
}
@fclose($fp);
/* 检查目录下是否有执行rename()函数的权限 */
if (@rename($test_file, $test_file) !== false)
{
$mark ^= 8;
}
@unlink($test_file);
}
/* 如果是文件 */
elseif (is_file($file_path))
{
/* 以读方式打开 */
$fp = @fopen($file_path, 'rb');
if ($fp)
{
$mark ^= 1; //可读 001
}
@fclose($fp);
/* 试着修改文件 */
$fp = @fopen($file_path, 'ab+');
if ($fp && @fwrite($fp, '') !== false)
{
$mark ^= 6; //可修改可写可读 111,不可修改可写可读011...
}
@fclose($fp);
/* 检查目录下是否有执行rename()函数的权限 */
if (@rename($test_file, $test_file) !== false)
{
$mark ^= 8;
}
}
}
else
{
if (@is_readable($file_path))
{
$mark ^= 1;
}
if (@is_writable($file_path))
{
$mark ^= 14;
}
}
return $mark;
}


函数执行的结果是:15,这个就表示目录是有可写权限的。这个就太奇怪了。我想想这个是不是有PHP.INI里的upload里的设置有关,一搜索,看到了file_uploads这个参数的值是off,应该是这个参数是off才导致上传不了图片的。

前一段时间DEDE的漏洞很多,很多用DEDE的网站都被黑了,可能是空间管理员看到网站被黑,所以限制了文件上传吧。

附PHP.INI参数说明

file_uploads boolean or integer
Whether or not to allow HTTP file uploads. See also the upload_max_filesize, upload_tmp_dir, and post_max_size directives.

当使用 integer 时, 其值以字节来衡量。还可以使用在FAQ中描述的速记符。
upload_tmp_dir string
The temporary directory used for storing files when doing file upload. Must be writable by whatever user PHP is running as. If not specified PHP will use the system's default.

If the directory specified here is not writable, PHP falls back to the system default temporary directory. If open_basedir is on, then the system default directory must be allowed for an upload to succeed.

upload_max_filesize integer
The maximum size of an uploaded file.

当使用 integer 时, 其值以字节来衡量。还可以使用在FAQ中描述的速记符。
max_file_uploads integer
The maximum number of files allowed to be uploaded simultaneously. Starting with PHP 5.3.4, upload fields left blank on submission do not count towards this limit.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐