🔒 修复命令注入漏洞并增强HTTPS配置
**安全修复:** - 修复命令执行语法错误(wmic命令字符串拼接) - 添加驱动器字母验证防止命令注入(仅允许A-Z) - 修复命令执行参数构造错误 **功能增强:** - 新增ENFORCE_HTTPS环境变量(强制HTTPS访问) - 更新.env.example添加ENFORCE_HTTPS配置说明 - 更新install.sh支持自动配置ENFORCE_HTTPS - 更新脚本自动为现有.env补充ENFORCE_HTTPS配置 这些改进消除了命令注入风险并提供了更灵活的HTTPS策略控制。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -18,6 +18,10 @@ PORT=40001
|
|||||||
# 运行环境(production 或 development)
|
# 运行环境(production 或 development)
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
|
|
||||||
|
# 强制HTTPS访问(生产环境建议开启)
|
||||||
|
# 设置为 true 时,仅接受 HTTPS 访问
|
||||||
|
ENFORCE_HTTPS=false
|
||||||
|
|
||||||
# 公开访问端口(nginx监听的端口,用于生成分享链接)
|
# 公开访问端口(nginx监听的端口,用于生成分享链接)
|
||||||
# 标准端口(80/443)可不配置
|
# 标准端口(80/443)可不配置
|
||||||
PUBLIC_PORT=80
|
PUBLIC_PORT=80
|
||||||
|
|||||||
@@ -3062,7 +3062,13 @@ app.get('/api/admin/storage-stats', authMiddleware, adminMiddleware, async (req,
|
|||||||
try {
|
try {
|
||||||
// 获取本地存储目录所在的驱动器号
|
// 获取本地存储目录所在的驱动器号
|
||||||
const driveLetter = localStorageDir.charAt(0);
|
const driveLetter = localStorageDir.charAt(0);
|
||||||
const { stdout: wmicOutput } = await execAsync(`wmic logicaldisk where "DeviceID='' + driveLetter + '':''" get Size,FreeSpace /value`, { encoding: 'utf8' });
|
if (!/^[A-Za-z]$/.test(driveLetter)) {
|
||||||
|
throw new Error('Invalid drive letter');
|
||||||
|
}
|
||||||
|
const { stdout: wmicOutput } = await execAsync(
|
||||||
|
`wmic logicaldisk where "DeviceID='${driveLetter}:'" get Size,FreeSpace /value`,
|
||||||
|
{ encoding: 'utf8' }
|
||||||
|
);
|
||||||
|
|
||||||
const freeMatch = wmicOutput.match(/FreeSpace=(\d+)/);
|
const freeMatch = wmicOutput.match(/FreeSpace=(\d+)/);
|
||||||
const sizeMatch = wmicOutput.match(/Size=(\d+)/);
|
const sizeMatch = wmicOutput.match(/Size=(\d+)/);
|
||||||
|
|||||||
35
install.sh
35
install.sh
@@ -2121,11 +2121,13 @@ create_env_file() {
|
|||||||
PROTOCOL="http"
|
PROTOCOL="http"
|
||||||
COOKIE_SECURE_VALUE="false"
|
COOKIE_SECURE_VALUE="false"
|
||||||
PORT_VALUE=${HTTP_PORT:-80}
|
PORT_VALUE=${HTTP_PORT:-80}
|
||||||
|
ENFORCE_HTTPS_VALUE="false"
|
||||||
else
|
else
|
||||||
# HTTPS 模式
|
# HTTPS 模式
|
||||||
PROTOCOL="https"
|
PROTOCOL="https"
|
||||||
COOKIE_SECURE_VALUE="true"
|
COOKIE_SECURE_VALUE="true"
|
||||||
PORT_VALUE=${HTTPS_PORT:-443}
|
PORT_VALUE=${HTTPS_PORT:-443}
|
||||||
|
ENFORCE_HTTPS_VALUE="true"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 生成 ALLOWED_ORIGINS (标准端口不需要显示端口号)
|
# 生成 ALLOWED_ORIGINS (标准端口不需要显示端口号)
|
||||||
@@ -2141,6 +2143,7 @@ create_env_file() {
|
|||||||
# 留空,后端默认允许所有来源(适合开发环境)
|
# 留空,后端默认允许所有来源(适合开发环境)
|
||||||
ALLOWED_ORIGINS_VALUE=""
|
ALLOWED_ORIGINS_VALUE=""
|
||||||
COOKIE_SECURE_VALUE="false"
|
COOKIE_SECURE_VALUE="false"
|
||||||
|
ENFORCE_HTTPS_VALUE="false"
|
||||||
print_warning "IP 模式下 CORS 将允许所有来源(仅适合开发环境)"
|
print_warning "IP 模式下 CORS 将允许所有来源(仅适合开发环境)"
|
||||||
print_info "生产环境建议使用域名模式"
|
print_info "生产环境建议使用域名模式"
|
||||||
fi
|
fi
|
||||||
@@ -2165,6 +2168,9 @@ PORT=${BACKEND_PORT}
|
|||||||
# 环境
|
# 环境
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
|
|
||||||
|
# 强制HTTPS(生产环境建议开启)
|
||||||
|
ENFORCE_HTTPS=${ENFORCE_HTTPS_VALUE}
|
||||||
|
|
||||||
# CORS 跨域配置
|
# CORS 跨域配置
|
||||||
# 允许访问的前端域名(多个用逗号分隔)
|
# 允许访问的前端域名(多个用逗号分隔)
|
||||||
# 生产环境必须配置具体域名,开发环境可留空
|
# 生产环境必须配置具体域名,开发环境可留空
|
||||||
@@ -3809,6 +3815,33 @@ print_update_completion() {
|
|||||||
echo ""
|
echo ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_patch_env() {
|
||||||
|
print_step "检查 .env 新增配置..."
|
||||||
|
if [[ -f "${PROJECT_DIR}/backend/.env" ]]; then
|
||||||
|
if ! grep -q "^ENFORCE_HTTPS=" "${PROJECT_DIR}/backend/.env"; then
|
||||||
|
# 基于现有配置做一个合理的默认值:如果已启用安全Cookie或公开端口为443,优先设为true
|
||||||
|
COOKIE_SECURE_CUR=$(grep "^COOKIE_SECURE=" "${PROJECT_DIR}/backend/.env" | cut -d'=' -f2- | tr '[:upper:]' '[:lower:]')
|
||||||
|
PUBLIC_PORT_CUR=$(grep "^PUBLIC_PORT=" "${PROJECT_DIR}/backend/.env" | cut -d'=' -f2-)
|
||||||
|
ALLOWED_CUR=$(grep "^ALLOWED_ORIGINS=" "${PROJECT_DIR}/backend/.env" | cut -d'=' -f2-)
|
||||||
|
|
||||||
|
ENFORCE_DEFAULT="false"
|
||||||
|
if [[ "$COOKIE_SECURE_CUR" == "true" ]] || [[ "$PUBLIC_PORT_CUR" == "443" ]]; then
|
||||||
|
ENFORCE_DEFAULT="true"
|
||||||
|
elif echo "$ALLOWED_CUR" | grep -qi "https://"; then
|
||||||
|
ENFORCE_DEFAULT="true"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "ENFORCE_HTTPS=${ENFORCE_DEFAULT}" >> "${PROJECT_DIR}/backend/.env"
|
||||||
|
print_warning "已为现有 .env 补充 ENFORCE_HTTPS=${ENFORCE_DEFAULT}(如生产请确认设为 true 并重启)"
|
||||||
|
else
|
||||||
|
print_info ".env 已包含 ENFORCE_HTTPS,保持不变"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_warning "未找到 ${PROJECT_DIR}/backend/.env,请手动确认配置"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
update_main() {
|
update_main() {
|
||||||
# 检查root权限
|
# 检查root权限
|
||||||
check_root
|
check_root
|
||||||
@@ -3849,6 +3882,8 @@ update_main() {
|
|||||||
|
|
||||||
# 迁移数据库配置
|
# 迁移数据库配置
|
||||||
update_migrate_database
|
update_migrate_database
|
||||||
|
# 补充新配置项
|
||||||
|
update_patch_env
|
||||||
|
|
||||||
# 重启服务
|
# 重启服务
|
||||||
update_restart_services
|
update_restart_services
|
||||||
|
|||||||
Reference in New Issue
Block a user