A. 相对路径 include/require 全量改写为 __DIR__ 基址
- 修复 nginx+fastcgi 下 php-cgi 继承启动目录 CWD (D:\phpstudy_pro\COM)
导致 require '../function/...' 相对路径 include 全部失效;
28 文件 101 处统一改为 __DIR__ 绝对基址,任意 Web 服务器行为一致。
- 补齐带括号/缺斜杠漏改的 13 处 (controller.php、epay lib、
payment.php、notify_url.php、return_url.php)。
- function/config.inc.php 增加 config.local.inc.php 本地覆盖机制
(该文件加入 .gitignore 不入库),仓库默认配置保持中立。
B. UEditor 后台入口安全加固 (P0-01)
- admin/php/controller.php 全部 action 前置管理员会话校验
(admin_username + admin_password),匿名无法上传/抓取/列目录/读配置。
- 禁用远程图片抓取 catchimage (SSRF 向量),删除 action_crawler.php。
- 上传/列表白名单剔除 .exe/.dll/.iso/.cab/.swf。
- Uploader: 移除 iconv('unicode') Windows 告警行;
getFileInfo/action_list 的 URL 拼接增加 REQUEST_SCHEME 回退。
验证: 匿名访问全部 action 返回未授权;登录态上传成功且 URL 正确;
catchimage 已禁用;JSON 合法;全量 php -l 0 错误;
nginx(8081) 与内置服务器(8082) 双通道回归通过。
98 lines
2.9 KiB
PHP
98 lines
2.9 KiB
PHP
<?php
|
|
/**
|
|
* 获取已上传的文件列表
|
|
* User: Jinqn
|
|
* Date: 14-04-09
|
|
* Time: 上午10:17
|
|
*/
|
|
include __DIR__ . "/Uploader.class.php";
|
|
|
|
/* 判断类型 */
|
|
switch ($_GET['action']) {
|
|
/* 列出文件 */
|
|
case 'listfile':
|
|
$allowFiles = $CONFIG['fileManagerAllowFiles'];
|
|
$listSize = $CONFIG['fileManagerListSize'];
|
|
$path = $CONFIG['fileManagerListPath'];
|
|
break;
|
|
/* 列出图片 */
|
|
case 'listimage':
|
|
|
|
default:
|
|
$allowFiles = $CONFIG['imageManagerAllowFiles'];
|
|
$listSize = $CONFIG['imageManagerListSize'];
|
|
$path = $CONFIG['imageManagerListPath'];
|
|
}
|
|
$allowFiles = substr(str_replace(".", "|", join("", $allowFiles)), 1);
|
|
|
|
/* 获取参数 */
|
|
$size = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $listSize;
|
|
$start = isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0;
|
|
$end = $start + $size;
|
|
|
|
/* 获取文件列表 */
|
|
$path = $G['sys']['rootdir'] . (substr($path, 0, 1) == "/" ? "" : "/") . $path;
|
|
$files = getfiles($path, $allowFiles);
|
|
if (!count($files)) {
|
|
return json_encode(array(
|
|
"state" => "no match file",
|
|
"list" => array(),
|
|
"start" => $start,
|
|
"total" => count($files)
|
|
));
|
|
}
|
|
|
|
/* 获取指定范围的列表 */
|
|
$len = count($files);
|
|
for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--) {
|
|
$list[] = $files[$i];
|
|
}
|
|
//倒序
|
|
//for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){
|
|
// $list[] = $files[$i];
|
|
//}
|
|
|
|
/* 返回数据 */
|
|
$result = json_encode(array(
|
|
"state" => "SUCCESS",
|
|
"list" => $list,
|
|
"start" => $start,
|
|
"total" => count($files)
|
|
));
|
|
//print_r($list);
|
|
|
|
return $result;
|
|
|
|
|
|
/**
|
|
* 遍历获取目录下的指定类型的文件
|
|
* @param $path
|
|
* @param array $files
|
|
* @return array
|
|
*/
|
|
function getfiles($path, $allowFiles, &$files = array())
|
|
{
|
|
global $G;
|
|
if (!is_dir($path)) return null;
|
|
if (substr($path, strlen($path) - 1) != '/') $path .= '/';
|
|
$handle = opendir($path);
|
|
while (false !== ($file = readdir($handle))) {
|
|
if ($file != '.' && $file != '..') {
|
|
$path2 = $path . $file;
|
|
if (is_dir($path2)) {
|
|
getfiles($path2, $allowFiles, $files);
|
|
} else {
|
|
if (preg_match("/\.(" . $allowFiles . ")$/i", $file)) {
|
|
//echo $path2;
|
|
$scheme = isset($_SERVER['REQUEST_SCHEME']) ? strtolower($_SERVER['REQUEST_SCHEME']) : (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');
|
|
$files[] = array(
|
|
|
|
'url' => $scheme . '://' . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . dirname(dirname(dirname($_SERVER['REQUEST_URI']))) . substr($path2, strlen($G['sys']['rootdir'])),
|
|
'mtime' => filemtime($path2)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $files;
|
|
} |