import crypto from 'node:crypto';
const RISK_ORDER = ['none', 'low', 'medium', 'high', 'critical'];
const HTML_TAG_PATTERN = /<[^>]+>/;
const PRIVATE_URL_PATTERN =
/(file:\/\/[^\s"'<>]+|\/api\/mindspace\/v1\/assets\/[a-z0-9-]+(?:\/[a-z-]+)?|\/users\/[^\s"'<>]+)/gi;
const TEXT_RULES = [
{
type: 'id_card',
label: '身份证号',
riskLevel: 'high',
blocking: true,
pattern: /(? `${value.slice(0, 6)}********${value.slice(-4)}`,
replacement: (value) => `${value.slice(0, 6)}********${value.slice(-4)}`,
},
{
type: 'bank_card',
label: '银行卡号',
riskLevel: 'high',
blocking: true,
pattern: /(? `${value.slice(0, 4)} **** **** ${value.slice(-4)}`,
replacement: (value) => `${value.slice(0, 4)} **** **** ${value.slice(-4)}`,
},
{
type: 'phone',
label: '手机号',
riskLevel: 'medium',
blocking: false,
pattern: /(? `${value.slice(0, 3)}****${value.slice(-4)}`,
replacement: (value) => `${value.slice(0, 3)}****${value.slice(-4)}`,
},
{
type: 'email',
label: '邮箱地址',
riskLevel: 'medium',
blocking: false,
pattern: /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi,
mask: (value) => `${value.slice(0, 2)}***@***`,
replacement: () => '[邮箱地址]',
},
{
type: 'api_key',
label: 'API Key',
riskLevel: 'critical',
blocking: true,
pattern:
/\b(?:sk|rk|pk)_(?:test_|live_|proj_)?[A-Za-z0-9]{16,}|AKIA[0-9A-Z]{16}\b|ghp_[A-Za-z0-9]{20,}\b|AIza[0-9A-Za-z\-_]{20,}\b/g,
mask: (value) => `${value.slice(0, 4)}********${value.slice(-4)}`,
replacement: () => '[API_KEY]',
},
{
type: 'access_token',
label: '访问令牌',
riskLevel: 'critical',
blocking: true,
pattern:
/\b(?:access[_-]?token|refresh[_-]?token|authorization)\b\s*[:=]?\s*(?:bearer\s+)?[A-Za-z0-9\-_=+.]{16,}/gi,
mask: (value) => `${value.slice(0, 10)}********`,
replacement: (value) => value.replace(/[A-Za-z0-9\-_=+.]{16,}$/i, '[TOKEN]'),
},
{
type: 'private_key',
label: '私钥',
riskLevel: 'critical',
blocking: true,
pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,
mask: () => '-----BEGIN PRIVATE KEY-----********',
replacement: () => '[PRIVATE_KEY]',
},
{
type: 'external_link',
label: '外部链接',
riskLevel: 'low',
blocking: false,
pattern: /https?:\/\/[^\s<>"')]+/gi,
mask: (value) => value.slice(0, 80),
replacement: (value) => value,
},
];
const HTML_RULES = [
{
type: 'html_script',
label: '脚本标签',
riskLevel: 'critical',
blocking: true,
pattern: /',
replacement: () => '',
},
{
type: 'html_external_script',
label: '外部 CDN 脚本',
riskLevel: 'high',
blocking: true,
pattern: /