安全(P0) - 发布包签名:新增 scripts/package_keygen.php、scripts/package_verify.php、 ywxapp\service\PackageVerifier;FrameworkService::apply() 解压前强制验签 (ywxapp.framework_package_verify,默认开启) - JWT 收紧:config/jwt.php 移除公开默认密钥,JwtService::assertStrongSecret() 校验非空 / 长度≥32 / 已知弱值;.env.production.example 键名由 JWT_SECRET_KEY 修正为 JWT_SECRET - /api/v1/Article:免登录白名单收窄为只读接口,写操作字段白名单 + assertOwner() 越权校验 - 开发者令牌:查找接口不再回显明文、统一失败文案 + 限流 - TemplateInstaller:文件名白名单 + realpath 归一化 + 目录内断言,修复 Zip Slip;补 use ZipArchive - 后台登录:接入验证码、失败锁定与登录限流(config/ratelimit.php) - 缓存 / Session 驱动可由 .env 覆盖(CACHE_DRIVER / SESSION_TYPE),集群部署改 redis - paycenter 支付日志开关改为 PAY_LOG,不再跟随 APP_DEBUG 工程化 / 交付 - 新增 CHANGELOG.md 与 .env.production.example;composer.lock 入库锁定依赖版本 - 插件离线安装 CLI 增加 --uid,后台上传安装透传 uid,付费插件授权校验可通过 - 授权拒绝文案区分「未携带 uid」与「未找到有效授权」,便于排障 - .gitignore 放行 .env.production.example / .env.addon.example / .gitattributes / public/.htaccess 结构 - appmall 由 addon/appmall 迁移为独立应用 app/appmall(市场 / 开发者中心 / 审核 / 分润)
118 lines
7.4 KiB
PHP
118 lines
7.4 KiB
PHP
<?php
|
||
/*
|
||
* @Author: YwxApp <ywx@ywxapp.cn>
|
||
* @Date: 2026-08-06 22:05:39
|
||
* @LastEditors: YwxApp <ywx@ywxapp.cn>
|
||
* @LastEditTime: 2026-08-07 00:32:06
|
||
* @Description:
|
||
* @FilePath: \ywxapp_dev\config\ywxapp.php
|
||
* @CustomString: Copyright (c) 2026 YwxApp
|
||
*/
|
||
/*
|
||
* @Author: YwxApp <ywx@ywxapp.cn>
|
||
* @Date: 2026-04-29 02:32:33
|
||
* @LastEditors: YwxApp <ywx@ywxapp.cn>
|
||
* @LastEditTime: 2026-07-28 02:41:55
|
||
* @Description:
|
||
* @FilePath: \ywxapp_dev\config\ywxapp.php
|
||
* @CustomString: Copyright (c) 2026 YwxApp
|
||
*/
|
||
// +----------------------------------------------------------------------
|
||
// | YwxApp [ WE CAN DO IT JUST THINK ]
|
||
// +----------------------------------------------------------------------
|
||
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
|
||
// +----------------------------------------------------------------------
|
||
// | Author: ywxapp<admin@ywxapp.cn>
|
||
// +----------------------------------------------------------------------
|
||
|
||
return [
|
||
'superAdmin' => 1,
|
||
//是否开启前台会员中心
|
||
'usercenter' => true,
|
||
//会员注册验证码类型email/mobile/wechat/text/false
|
||
'user_register_captcha' => 'text',
|
||
//登录验证码
|
||
'login_captcha' => true,
|
||
//登录失败超过10次则1天后重试
|
||
'login_failure_retry' => true,
|
||
|
||
// ---- 登录爆破防护(AdminAuth::login 消费;不依赖 RateLimit 中间件 ----
|
||
// 原因:config/ratelimit.php 的 RateLimit 中间件只在 app/api 注册,
|
||
// 后台 /admin/login 走不到,必须有独立的计数兜底。
|
||
// 同一 IP + 同一账号在窗口内失败达上限 → 封禁 block 秒。设 0 表示关闭限流。
|
||
'login_fail_limit' => (int) env('LOGIN_FAIL_LIMIT', 10),
|
||
'login_fail_window' => (int) env('LOGIN_FAIL_WINDOW', 600),
|
||
'login_block_time' => (int) env('LOGIN_BLOCK_TIME', 900),
|
||
//是否同一账号同一时间只能在一个地方登录
|
||
'login_unique' => false,
|
||
//是否开启IP变动检测
|
||
'loginip_check' => true,
|
||
//登录页默认背景图
|
||
'login_background' => '',
|
||
//是否启用多级菜单导航
|
||
'multiplenav' => false,
|
||
//是否开启多选项卡(仅在开启多级菜单时起作用)
|
||
'multipletab' => true,
|
||
//后台皮肤,为空时表示使用skin-blue-light
|
||
'adminskin' => '',
|
||
//自动检测更新
|
||
'checkupdate' => false,
|
||
//API是否允许跨域
|
||
'api_cross' => false,
|
||
//版本号
|
||
'version' => '1.1.1',
|
||
//API接口地址(本地自测:指向本机;生产部署需改回 https://www.ywxapp.cn,并确保中心站已部署含 framework 路由的新版 market)
|
||
'api_url' => env('APP_API_URL', 'https://www.ywxapp.cn'),
|
||
// 市场角色(控制 is_market_client()):center=本机即中心站 / client=本机即客户机 / auto=按 api_url+本机主机推断
|
||
// 显式声明优于 auto:避免 api_url 误指向别处时角色翻转。本地开发建议直接设 center。
|
||
'market_mode' => env('APP_MARKET_MODE', 'auto'),
|
||
// 是否开启多语言
|
||
'lang_switch_on' => true,
|
||
//是否允许未知来源的插件压缩包(本地离线安装需开启,配合 APP_DEBUG 跳过远程授权校验)
|
||
//安全提示:该开关仅在 APP_DEBUG=true 时才会真正跳过远程授权校验;生产环境务必保持
|
||
//APP_DEBUG=false,并可通过环境变量 ADDON_UNKNOWN_SOURCES=false 显式关闭离线安装,杜绝任意离线包直装。
|
||
'unknownsources' => env('ADDON_UNKNOWN_SOURCES', false),
|
||
//插件启用禁用时是否备份对应的全局文件
|
||
'backup_global_files' => true,
|
||
//插件纯净模式,插件启用后是否删除插件目录的application、public和assets文件夹
|
||
'addon_pure_mode' => true,
|
||
'addon_license_check' => env('ADDON_LICENSE_CHECK', false), // 运行期授权校验开关(true 时声明 license=>true 的付费插件需存在有效授权才加载)
|
||
// 下载签名密钥:用于 download 接口 generateSign 校验,防 license_key 泄漏后被冒用下载。
|
||
// 生产环境务必改为强随机值(建议写入 .env 的 ADDON_SECRET),并保持与 API 客户端一致。
|
||
// 生成强随机密钥示例: openssl rand -base64 64 或 bin2hex(random_bytes(32))
|
||
'addon_secret' => env('ADDON_SECRET', ''),
|
||
// 下载签名校验开关:true 时 download 接口要求请求携带合法 sign+ts(配合 generateSign)。
|
||
// 启用后 API 客户端需用 license_key 计算签名,否则下载将被拒绝。默认关闭以免破坏现有下载链路。
|
||
// 自托管市场(中心站 addon/market 插件,路由 /api/addon/*)已配套实现:客户端 AddonService::download() 在开启时自动签名;
|
||
// 启用前请确保 api_url 指向本服务器(服务端/客户端共享同一 addon_secret)。
|
||
'addon_download_sign' => false,
|
||
|
||
// 主框架发布包(整站包/补丁/安装包)强制验签开关。
|
||
// true:FrameworkService::apply() 解压前必须过 PackageVerifier 的 RSA 验签,
|
||
// 未签名/签名不符/版本不一致一律拒绝安装(防升级通道被用作远程代码执行)。
|
||
// 仅「自建升级服务器 + 自己签名」的内网调试场景可关闭:FRAMEWORK_PACKAGE_VERIFY=false
|
||
'framework_package_verify' => env('FRAMEWORK_PACKAGE_VERIFY', true),
|
||
|
||
// 发布包公钥路径(留空用 ywxapp/data/package_public.pem,或 PackageVerifier::BUILTIN_PUBLIC_KEY)
|
||
'package_public_key_path' => env('PACKAGE_PUBLIC_KEY_PATH', ''),
|
||
// 应用市场(appmall)的运行期配置(开发者令牌、远程开关、SSL 校验、抽成比例等):
|
||
// appmall 已由插件迁为普通应用(app/appmall),其配置统一放在根级 config/appmall.php
|
||
// (全局加载,任意应用均可 config('appmall.*')),并由 .env 覆盖。
|
||
// 开发模式开关(抄 Discuz! 插件设计器):开启后后台「插件」出现「设计插件」入口,
|
||
// 可可视化创建/编辑本地插件(生成骨架、增删配置项/菜单/事件/路由、生成页面模块),改动实时生效。
|
||
// 生产环境务必保持 false(与 APP_DEBUG 解耦,独立开关)。
|
||
|
||
// 历史上后台「发布到官方市场」误把 developer_token 关联到 DEVELOPER_TOKEN,导致用户照着错误提示配错键。
|
||
// 现统一为 APPMARKET_DEV_TOKEN(与 config/appmall.php 同源),错误提示也同步修正。
|
||
'developer_token' => env('APPMARKET_DEV_TOKEN', ''),
|
||
'addon_developer' => env('ADDON_DEVELOPER', false),
|
||
// 钩点可视化标注(Discuz 式开发者模式):开启后页面上的每个 hook() 埋点用蓝色虚线框 + 「⟡ 钩子名」标签标出,
|
||
// 未挂载插件的空埋点同样显示,便于对照「模板位置 ↔ 钩子名」。
|
||
// 后台「数据运维 → 模板钩子」可临时开关(cookie hook_dev,只在后台应用内生效,防泄漏给前台访客);
|
||
// 本开关为全局模式,前台/会员中心也需要标注时才置 true(建议仅开发环境)。
|
||
'hook_developer' => env('HOOK_DEVELOPER', false),
|
||
|
||
'backend_login_url' => '/admin/login/index', // 后台登录页地址(app_map: admin => backend)
|
||
'member_login_url' => '/user/login/index', // 会员中心登录页地址(app_map: member => frontend)
|
||
];
|