fix(GOV-012): 拒绝 MariaDB 伪装版本
This commit is contained in:
@@ -60,3 +60,9 @@
|
|||||||
- HTTP/OpenAPI、Web API、消息契约、Redis、API、Scheduler、Worker、部署:本 Task 仅新增 Node 治理工具安全基础,不接入运行时服务,均无同步代码修改;边界是后续 Task 将替换 Schema CLI 内部实现。
|
- HTTP/OpenAPI、Web API、消息契约、Redis、API、Scheduler、Worker、部署:本 Task 仅新增 Node 治理工具安全基础,不接入运行时服务,均无同步代码修改;边界是后续 Task 将替换 Schema CLI 内部实现。
|
||||||
- 数据库:不建立连接、不查询业务数据、不执行 DDL/DML/多语句/锁表;本 Task 仅固定未来连接选项和服务端元数据契约。
|
- 数据库:不建立连接、不查询业务数据、不执行 DDL/DML/多语句/锁表;本 Task 仅固定未来连接选项和服务端元数据契约。
|
||||||
- 测试、依赖和文档:新增 mysql2 根开发依赖、Node 单元测试和本影响记录;`pnpm audit --audit-level high` 是依赖安全门禁。
|
- 测试、依赖和文档:新增 mysql2 根开发依赖、Node 单元测试和本影响记录;`pnpm audit --audit-level high` 是依赖安全门禁。
|
||||||
|
|
||||||
|
### Task 1 依赖审计范围限定例外
|
||||||
|
|
||||||
|
- 官方 registry 审计确认既有 Web 测试依赖链 `@vue/test-utils -> js-beautify -> glob` 存在一项 high;新增的 `mysql2@3.23.3` 不在该依赖路径中。
|
||||||
|
- 用户于 2026-08-18 明确同意 GOV-012 使用范围限定例外继续:该既有风险作为单独治理欠项处理,本功能不得擅自升级前端测试依赖,也不得把该例外解释为 `mysql2` 安全审计通过之外的通用放行。
|
||||||
|
- GOV-012 发布前的代码 Review 和开发规范 Review 必须继续披露该残余风险;若后续审计发现 `mysql2`、Schema 导出链路或生产依赖新增 high/critical,则本例外不适用并立即阻断。
|
||||||
|
|||||||
@@ -62,7 +62,8 @@ export function quoteIdentifier(identifier) {
|
|||||||
* `SHOW CREATE` 文本在不兼容语义下被误认为可恢复的 Schema 快照。
|
* `SHOW CREATE` 文本在不兼容语义下被误认为可恢复的 Schema 快照。
|
||||||
*/
|
*/
|
||||||
export function assertMysql57ServerMetadata(metadata) {
|
export function assertMysql57ServerMetadata(metadata) {
|
||||||
if (!/^5\.7\.\d+(?:[-+].*)?$/.test(metadata?.serverVersion ?? '')) {
|
const serverVersion = metadata?.serverVersion ?? '';
|
||||||
|
if (!/^5\.7\.\d+(?:[-+].*)?$/.test(serverVersion) || /mariadb/i.test(serverVersion)) {
|
||||||
throw new SchemaExportError('UNSUPPORTED_SERVER_VERSION', 'MySQL 服务端必须为 5.7.x');
|
throw new SchemaExportError('UNSUPPORTED_SERVER_VERSION', 'MySQL 服务端必须为 5.7.x');
|
||||||
}
|
}
|
||||||
if (metadata.databaseCharset !== 'utf8mb4') {
|
if (metadata.databaseCharset !== 'utf8mb4') {
|
||||||
|
|||||||
@@ -48,7 +48,12 @@ test('只接受 MySQL 5.7.x 与固定字符规则', () => {
|
|||||||
databaseCollation: 'utf8mb4_general_ci',
|
databaseCollation: 'utf8mb4_general_ci',
|
||||||
};
|
};
|
||||||
assert.doesNotThrow(() => assertMysql57ServerMetadata(valid));
|
assert.doesNotThrow(() => assertMysql57ServerMetadata(valid));
|
||||||
for (const serverVersion of ['5.6.51', '8.0.40', '10.6.18-MariaDB']) {
|
for (const serverVersion of [
|
||||||
|
'5.6.51',
|
||||||
|
'8.0.40',
|
||||||
|
'5.7.42-MariaDB',
|
||||||
|
'10.6.18-MariaDB',
|
||||||
|
]) {
|
||||||
assert.throws(() => assertMysql57ServerMetadata({ ...valid, serverVersion }));
|
assert.throws(() => assertMysql57ServerMetadata({ ...valid, serverVersion }));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user