本帖最后由 又是馒头 于 2025-10-22 13:53 编辑
吃水不忘挖井人,首先要向原创作者29176413致敬,在征得其同意后,在其发布的V7.0版本之上进行优化更新的。
原作者帖子链接:https://www.52pojie.cn/thread-2061527-1-1.html,原作者也一直在更新,但和我的侧重点、关注点不同,大家可根据需要自行选择。
版本 7.3 更新日志 更新日期:2025-10-22
问题修复- Windows+IIS环境下复制链接功能修复
- 修复了在Windows IIS服务器环境下右键菜单复制链接功能不生效的问题
- 改进了路径处理逻辑,正确处理Windows格式的文件路径(如D:\wwwroot\video_rei5ze\web\...)
- 优化了复制链接的生成规则,确保生成的链接只包含相对于网站根目录的正确路径
- 增强了路径分隔符统一处理,确保URL格式标准合规
下载地址:https://tungsl.lanzouu.com/b0koirl6h
下载密码: 52pojie.cn
V7.2 更新日志
主要新增功能- 文件筛选功能
- 新增完整的文件筛选系统,支持按名称、权限、日期、大小等多个维度进行文件筛选
- 增加"包含子目录"筛选选项,以图标形式呈现(默认月牙图标🌙代表仅当前目录,点击切换为满月图标🌕代表包含子目录)
- 上传冲突处理与备份机制
- 上传文件或文件夹时,若遇到重名文件,自动将原有文件重命名为文件名_backup_时间戳格式,同时上传新文件
- 添加顶部"清理备份"按钮,可一键删除所有包含backup的备份文件,方便测试结束后清理
- 防止覆盖上传后无法找回原文件的情况,提高了文件操作的安全性
- 系统环境检查独立与增强
- 将系统环境检查从主程序中分离,成为独立页面
- 详细列举程序所需的各种函数状态及其影响级别
- 新增环境检查结果导出功能,方便问题诊断与报告
- 文本编辑功能优化
- 改进了保存、保存并关闭、取消按钮的处理逻辑
- 在筛选结果列表中可以通过双击文件直接打开编辑,简化了操作流程
- 在正常文件列表中保持右键菜单编辑操作,确保操作的一致性和可预测性
UI/UX优化- 操作提示系统重构
- 所有操作成功、失败等提示信息均改为简洁明了的形式
- 提示信息会在显示一段时间后自动消失,避免界面混乱
- 保持界面整洁,减少用户手动关闭提示的操作
V7.2下载地址:https://tungsl.lanzouu.com/ig8vw38wi95g
注意:因为筛选功能使用了目录遍历,故可能被报毒,担心的就不要下载了,我使用的火绒是报毒了,我已经联系火绒了,火绒答复21日更新病毒库解除误报,其他杀毒没测。
-----------------------------------------------------------------------------------------------------------
V7.1更新日志
一、新增文件
1. ftp_config.php - 配置文件
新增独立的配置文件,集中管理系统的所有设置,使主程序更加简洁,便于维护和更新。
主要配置项 :
- 安全设置
- 密码哈希存储:使用 $PASSWORD_HASH 变量存储加密的密码哈希
- IP白名单:通过 $ALLOWED_IPS 数组限制允许访问的IP地址
- 登录安全:包含 $MAX_LOGIN_ATTEMPTS (最大登录尝试次数)和 $LOGIN_LOCK_TIME (登录锁定时间)
- 会话超时: $SESSION_TIMEOUT 设置会话有效期为30分钟
- HTTPS强制: $FORCE_HTTPS 选项可启用HTTPS访问强制跳转
-IP黑名单配置:触发黑名单的最大尝试次数默认为30次、黑名单持续时间(秒)默认 24小时、
- 功能限制
- 编辑文件大小限制: $MAX_EDITABLE_SIZE 设置为5MB
-大文件分块上传的块大小:$UPLOAD_CHUNK_SIZE默认设置为 10MB
-决定使用普通上传还是分块上传的文件大小阈值$LARGE_FILE_THRESHOLD 默认设置为15MB;
-允许上传的文件类型(空数组表示不限制);
-禁止上传的文件类型(优先级高于允许类型);
-禁止删除的文件列表
以下是配置文件代码:
[PHP] 纯文本查看 复制代码 <?php
// FTP工具配置文件 - 请将此文件放在网站根目录之外的安全位置
// 例如: /home/yourusername/ftp_config.php
// ==================== 安全设置 ====================
// 密码设置(请修改为强密码)
$PASSWORD_HASH = '$2y$10$hNlBu4PD9FL3xyKUEpRedOYNdIOEaVdW0sH1YffuIFjrHOBH0Zq4m';
// 允许的IP地址列表(可选,留空则不限制IP)
$ALLOWED_IPS = [
// '1.1.1.1',
// ‘2.2.2.2’
];
// 最大登录尝试次数
$MAX_LOGIN_ATTEMPTS = 15;
// 锁定时间(秒)
$LOGIN_LOCK_TIME = 120;
// 会话超时时间(秒)- 30分钟
$SESSION_TIMEOUT = 1800;
// IP黑名单配置
// 触发黑名单的最大尝试次数
$MAX_BLACKLIST_ATTEMPTS = 30;
// 黑名单持续时间(秒)- 24小时
$BLACKLIST_DURATION = 86400;
// 黑名单存储文件路径
$BLACKLIST_FILE = $basePath . '/protected/ip_blacklist.json';
// 是否启用HTTPS强制跳转(如果网站支持HTTPS,建议启用)
$FORCE_HTTPS = true;
// ==================== 功能限制 ====================
// 最大可编辑文件大小(字节)- 5MB
$MAX_EDITABLE_SIZE = 5 * 1024 * 1024;
// 大文件分块上传的块大小(字节)- 10MB
$UPLOAD_CHUNK_SIZE = 10 * 1024 * 1024;
// 决定使用普通上传还是分块上传的文件大小阈值(字节)- 15MB
$LARGE_FILE_THRESHOLD = 15 * 1024 * 1024;
// 允许上传的文件类型(空数组表示不限制)
$ALLOWED_UPLOAD_TYPES = [
];
// 禁止上传的文件类型(优先级高于允许类型)
$BLOCKED_UPLOAD_TYPES = [
'exe'
];
// ==================== 安全保护 ====================
// 禁止删除的文件列表
$PROTECTED_FILES = [
'ftp.php',
'ftp_config.php',
'web_hash_generator.php'
];
// 禁止删除的目录列表
$PROTECTED_DIRECTORIES = [
'protected'
];
?>
2. web_hash_generator.php - 密码哈希生成工具
新增网页版密码哈希生成工具,用于安全地生成符合系统要求的密码哈希值。
主要功能 :
- 密码强度验证:要求密码至少8个字符,包含字母和数字
- 密码可见性切换:支持显示/隐藏密码明文
- 一键复制哈希值:方便用户复制生成的哈希值到配置文件
- 使用指南:
1.访问 web_hash_generator.php 页面
2.输入符合要求的密码
3.点击"生成哈希值"按钮
4.复制生成的哈希值
5.在 ftp_config.php 中更新 $PASSWORD_HASH 变量
目前压缩包内配置文件中的默认密码是:52pojie.cn
下面是本部分代码:
[PHP] 纯文本查看 复制代码 <?php
/**
* 网页版密码哈希生成工具
* 这个脚本可以通过浏览器访问,用于生成安全的密码哈希值
*/
// 设置页面编码
header('Content-Type: text/html; charset=utf-8');
$generated_hash = null;
$message = null;
$message_type = 'info';
// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['password'])) {
$password = $_POST['password'];
// 验证密码强度
if (strlen($password) < 8) {
$message = '密码至少需要8个字符';
$message_type = 'error';
} elseif (!preg_match('/[A-Za-z]/', $password) || !preg_match('/[0-9]/', $password)) {
$message = '密码必须包含字母和数字';
$message_type = 'error';
} else {
// 生成密码哈希
$generated_hash = password_hash($password, PASSWORD_DEFAULT);
$message = '密码哈希生成成功';
$message_type = 'success';
}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>密码哈希生成工具</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background-color: white;
padding: 30px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
h1 {
color: #333;
text-align: center;
margin-bottom: 30px;
}
.form-group {
margin-bottom: 20px;
}
label {
display: block;
margin-bottom: 8px;
font-weight: bold;
color: #555;
}
input[type="password"] {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 16px;
box-sizing: border-box;
}
button {
background-color: #4CAF50;
color: white;
border: none;
padding: 12px 20px;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
width: 100%;
}
button:hover {
background-color: #45a049;
}
.hash-result {
margin-top: 20px;
padding: 15px;
background-color: #f9f9f9;
border: 1px solid #ddd;
border-radius: 4px;
word-break: break-all;
}
.copy-btn {
margin-top: 10px;
background-color: #2196F3;
padding: 8px 15px;
width: auto;
}
.copy-btn:hover {
background-color: #0b7dda;
}
.message {
padding: 10px;
margin-bottom: 20px;
border-radius: 4px;
}
.message.success {
background-color: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
.message.error {
background-color: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
.message.info {
background-color: #d1ecf1;
color: #0c5460;
border: 1px solid #bee5eb;
}
.instructions {
margin-top: 30px;
padding: 15px;
background-color: #f0f7ff;
border: 1px solid #bed6ff;
border-radius: 4px;
}
.instructions h3 {
margin-top: 0;
color: #1e40af;
}
code {
background-color: #f8f9fa;
padding: 2px 4px;
border-radius: 3px;
font-family: monospace;
}
</style>
</head>
<body>
<div class="container">
<h1>密码哈希生成工具</h1>
<?php if ($message): ?>
<div class="message <?php echo $message_type; ?>">
<?php echo $message; ?>
</div>
<?php endif; ?>
<form method="post">
<div class="form-group">
<label for="password">输入密码:</label>
<div style="position: relative;">
<input type="password" id="password" name="password" placeholder="请输入要生成哈希的密码" required style="padding-right: 40px; width: 100%; box-sizing: border-box;">
<button type="button" id="toggle-password" style="position: absolute; right: 5px; top: 50%; transform: translateY(-50%); background: none; border: none; cursor: pointer; color: #666; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; font-size: 16px;">
👁️
</button>
</div>
</div>
<button type="submit">生成哈希值</button>
</form>
<?php if ($generated_hash): ?>
<div class="hash-result">
<strong>生成的哈希值:</strong>
<div id="hash-value"><?php echo $generated_hash; ?></div>
<button class="copy-btn">复制哈希值</button>
</div>
<?php endif; ?>
<div class="instructions">
<h3>使用说明:</h3>
<ol>
<li>在上方输入您想要使用的密码</li>
<li>点击"生成哈希值"按钮</li>
<li>复制生成的哈希值</li>
<li>打开 <code>ftp_config.php</code> 文件</li>
<li>将 <code>$PASSWORD_HASH</code> 变量的值替换为生成的哈希值</li>
<li>确保注释掉或删除任何明文密码</li>
</ol>
<p><strong>注意:</strong> 请妥善保管您的密码,系统只存储密码的哈希值,无法从哈希值还原出原始密码。</p>
</div>
</div>
<script>
function copyToClipboard() {
const hashText = document.getElementById('hash-value').innerText;
navigator.clipboard.writeText(hashText)
.then(() => {
alert('哈希值已复制到剪贴板');
})
.catch(err => {
console.error('复制失败:', err);
});
}
// 切换密码显示/隐藏功能
document.getElementById('toggle-password').addEventListener('click', function() {
const passwordInput = document.getElementById('password');
// 保存当前输入框的值和尺寸
const value = passwordInput.value;
const width = passwordInput.offsetWidth;
const height = passwordInput.offsetHeight;
// 切换输入框类型
const type = passwordInput.getAttribute('type') === 'password' ? 'text' : 'password';
passwordInput.setAttribute('type', type);
// 恢复输入框的值和尺寸
passwordInput.value = value;
passwordInput.style.width = width + 'px';
passwordInput.style.height = height + 'px';
// 切换按钮图标(使用更直观的图标)
this.textContent = type === 'password' ? '👁️' : '🚫';
});
</script>
</body>
</html>
二、新增功能
1. 安全增强功能
登录验证系统 :从无安全验证到完整登录系统
- 以前:任何人知道链接即可访问,存在严重安全隐患
- 现在:必须通过密码验证才能访问系统
注销登录 :增加注销功能,保护账户安全
IP白名单机制 :新增IP白名单列表,只有指定IP才能访问
IP黑名单机制 :新增长期黑名单功能,与临时锁定并存
- 15次密码错误:临时锁定120秒
- 30次密码错误:IP加入黑名单24小时后自动解除
密码生成工具 :新增密码哈希生成工具页面,方便管理员设置安全密码
主文件代码太长了,没法粘贴出来,想看的话下载附件自行查看,没有加密,下面是安全验证部分代码:
[PHP] 纯文本查看 复制代码 // ==================== 安全验证 ====================
session_start();
// 配置文件路径
$configPath = $basePath . '/protected/ftp_config.php';
if (!file_exists($configPath)) {
die('配置文件不存在,请检查路径: ' . $configPath);
}
require_once $configPath;
// 黑名单管理函数
function loadBlacklist() {
global $BLACKLIST_FILE;
if (!file_exists($BLACKLIST_FILE)) {
return [];
}
$content = file_get_contents($BLACKLIST_FILE);
return json_decode($content, true) ?: [];
}
function saveBlacklist($blacklist) {
global $BLACKLIST_FILE;
file_put_contents($BLACKLIST_FILE, json_encode($blacklist, JSON_PRETTY_PRINT));
}
function isIPBlacklisted($ip) {
$blacklist = loadBlacklist();
if (!isset($blacklist[$ip])) {
return false;
}
// 检查黑名单是否已过期
$currentTime = time();
if ($blacklist[$ip] < $currentTime) {
// 移除过期的黑名单记录
unset($blacklist[$ip]);
saveBlacklist($blacklist);
return false;
}
return true;
}
function addIPToBlacklist($ip) {
global $BLACKLIST_DURATION;
$blacklist = loadBlacklist();
$blacklist[$ip] = time() + $BLACKLIST_DURATION;
saveBlacklist($blacklist);
}
// IP失败尝试记录函数
function getIPFailedAttempts($ip) {
$logFile = 'ip_failed_attempts.log';
if (!file_exists($logFile)) {
return 0;
}
$attempts = 0;
$lines = file($logFile);
foreach ($lines as $line) {
if (strpos($line, $ip) !== false) {
$attempts++;
}
}
return $attempts;
}
function logIPFailedAttempt($ip) {
$logFile = 'ip_failed_attempts.log';
$logEntry = date('Y-m-d H:i:s') . ' - ' . $ip . "\n";
file_put_contents($logFile, $logEntry, FILE_APPEND);
}
function clearIPFailedAttempts($ip) {
$logFile = 'ip_failed_attempts.log';
if (!file_exists($logFile)) {
return;
}
$lines = file($logFile);
$filteredLines = array_filter($lines, function($line) use ($ip) {
return strpos($line, $ip) === false;
});
file_put_contents($logFile, implode('', $filteredLines));
}
// 检查是否在黑名单中
$userIP = $_SERVER['REMOTE_ADDR'];
if (isIPBlacklisted($userIP)) {
$blacklist = loadBlacklist();
$remainingTime = $blacklist[$userIP] - time();
$hours = floor($remainingTime / 3600);
$minutes = floor(($remainingTime % 3600) / 60);
die("您的IP已被暂时禁止访问。请在{$hours}小时{$minutes}分钟后再试。");
}
// 检查IP限制
if (!empty($ALLOWED_IPS) && !in_array($userIP, $ALLOWED_IPS)) {
die('访问被拒绝:您的IP('.$userIP.')不在允许列表中');
}
// 初始化登录尝试计数器
if (!isset($_SESSION['login_attempts'])) {
$_SESSION['login_attempts'] = 0;
}
// 失败尝试记录已移至密码验证失败时执行
// 检查HTTPS
if ($FORCE_HTTPS && empty($_SERVER['HTTPS'])) {
header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;
}
// 检查认证
if (!isset($_SESSION['ftp_authenticated']) || $_SESSION['ftp_authenticated'] !== true) {
if (isset($_POST['password']) && !empty($_POST['password'])) {
// 只有实际提交了密码才计数
if ($_SESSION['login_attempts'] >= $MAX_LOGIN_ATTEMPTS) {
// 设置锁定时间
if (!isset($_SESSION['lock_time'])) {
$_SESSION['lock_time'] = time();
}
showLoginForm('登录尝试过多,请稍后再试');
}
if (password_verify($_POST['password'], $PASSWORD_HASH)) {
$_SESSION['ftp_authenticated'] = true;
$_SESSION['login_attempts'] = 0;
$_SESSION['last_activity'] = time();
// 登录成功,清除该IP的失败尝试记录
$userIP = $_SERVER['REMOTE_ADDR'];
clearIPFailedAttempts($userIP);
// 登录成功后重定向,确保页面通过GET请求加载,解决白屏问题
header('Location: ' . $_SERVER['PHP_SELF']);
exit;
} else {
$_SESSION['login_attempts']++;
$userIP = $_SERVER['REMOTE_ADDR'];
// 记录失败尝试
file_put_contents('login_attempts.log',
date('Y-m-d H:i:s').' - '.$userIP.' - 尝试次数: '.$_SESSION['login_attempts'].'\n',
FILE_APPEND
);
// 记录IP级别的失败尝试
logIPFailedAttempt($userIP);
// 检查是否达到黑名单触发次数
$totalFailedAttempts = getIPFailedAttempts($userIP);
if ($totalFailedAttempts >= $MAX_BLACKLIST_ATTEMPTS) {
// 添加到黑名单
addIPToBlacklist($userIP);
die("登录尝试过多,您的IP已被暂时禁止访问24小时。");
}
// 检查是否达到最大尝试次数,如果是则设置锁定时间
if ($_SESSION['login_attempts'] >= $MAX_LOGIN_ATTEMPTS) {
$_SESSION['lock_time'] = time();
// 重定向到锁定页面
header('Location: ' . $_SERVER['PHP_SELF'] . '?locked=true');
} else {
// 使用Post/Redirect/Get模式防止表单重复提交
header('Location: ' . $_SERVER['PHP_SELF'] . '?error=password');
}
exit;
}
} else {
// 检查是否有错误参数但没有POST请求(可能是重定向后的GET请求)
$error = '';
// 优先检查是否锁定状态
if (isset($_GET['locked']) && $_GET['locked'] === 'true') {
// 锁定状态不设置具体错误信息,由showLoginForm内部处理
$error = '';
} else if (isset($_GET['error']) && $_GET['error'] === 'password') {
$error = '密码错误';
}
// 未提交密码时显示登录表单,不计数
showLoginForm($error);
}
exit;
}
// 登录尝试次数检查已整合到认证逻辑中
// 以下代码已移至登录验证流程中,避免重复执行和逻辑冲突
// 初始化和检查会话超时
if (!isset($_SESSION['last_activity'])) {
$_SESSION['last_activity'] = time();
} elseif (time() - $_SESSION['last_activity'] > $SESSION_TIMEOUT) {
session_unset();
session_destroy();
showLoginForm('会话已超时,请重新登录');
exit;
}
$_SESSION['last_activity'] = time();
// ==================== 功能函数 ====================
function showLoginForm($error = '') {
global $MAX_LOGIN_ATTEMPTS, $ALLOWED_IPS, $LOGIN_LOCK_TIME;
// 初始化登录尝试次数会话变量(如果不存在)
if (!isset($_SESSION['login_attempts'])) {
$_SESSION['login_attempts'] = 0;
}
// 检查是否处于锁定状态
$isLocked = false;
$remainingTime = 0;
if (isset($_SESSION['login_attempts']) && $_SESSION['login_attempts'] >= $MAX_LOGIN_ATTEMPTS) {
if (isset($_SESSION['lock_time'])) {
$timeSinceLock = time() - $_SESSION['lock_time'];
if ($timeSinceLock < $LOGIN_LOCK_TIME) {
$isLocked = true;
$remainingTime = $LOGIN_LOCK_TIME - $timeSinceLock;
// 锁定状态下不显示传入的错误信息,避免重复
$error = '';
} else {
// 锁定时间已过,重置登录尝试次数
$_SESSION['login_attempts'] = 0;
$_SESSION['lock_time'] = null;
}
}
}
?>
2. 文件操作功能
复制链接 :右键菜单新增"复制链接"选项,一键复制文件访问URL到剪贴板
图片/视频预览 :支持直接预览图片和视频文件、图片支持上一张/下一张翻页浏览
文本编辑器优化 :文本编辑框增加行号显示,提升代码编辑体验
设置权限:新增批量设置文件及文件夹权限功能
访问网站 :新增直接访问网站功能,方便快速查看在线内容
复制功能:支持文件及文件夹的复制
移动功能:支持文件及文件夹的移动
三、界面与用户体验优化
1. 文件列表改进
- 日期显示 :文件列表新增修改日期显示
- 权限显示:文件列表显示权限
- 文件夹统计 :文件夹名称后增加文件数量统计
- 加宽页面 :扩展页面宽度,提供更大的工作区域
- 取消顶部标题 :移除页面顶部标题和副标题,增加可视工作区域
- 优化全选功能:取消权限按钮,在文件及文件夹前增加勾选框
2. 交互体验优化
- 修复滚动问题 :解决了因鼠标选中悬浮效果导致的底部滚动条和页面颤动问题
四、系统配置优化
1. 配置文件优化
- 统一配置管理 :将大文件分块上传的配置转移到统一的配置文件中
- 取消了硬编码,便于集中管理和修改配置
- 程序文件保护 :增加了对本程序文件的防删除保护,防止误操作删除核心文件
- 文件大小限制 :增加了文件大小限制配置,防止编辑过大文件
- 优化安全配置 :全面优化了安全配置项,提升系统整体安全性
总结
本次更新不仅从根本上提升了系统安全性,从无保护状态升级到包含登录验证、IP白名单和黑名单的完整安全体系,还通过多项实用功能和界面优化,让文件管理操作更加便捷高效。新增的复制链接、媒体预览等功能将大大提升您的使用体验,而配置管理的优化则让系统维护更加简单可靠。
可从附件下载,也可从https://tungsl.lanzouu.com/i2YcA382k52b下载 |