背景与价值开放重定向可被滥用进行钓鱼与令牌盗用。通过白名单与带过期签名的短链治理,可大幅降低攻击面并实现可追踪。统一规范允许域白名单:只允许业务批准的 `https` 域名与路径前缀。短链签名:对目标路径与过期时间进行HMAC签名,拒绝过期或签名不匹配。同源限制:默认仅允许同源或白名单外跳;开发例外需单列域名。核心实现白名单与同源校验const allowOrigins = new Set([

'https://app.example.com',

'https://www.example.com',

'https://docs.example.com'

])

function allowedRedirect(url: string): boolean {

try {

const u = new URL(url)

if (u.protocol !== 'https:') return false

const origin = u.origin

if (allowOrigins.has(origin)) return true

return false

} catch {

return false

}

}

短链签名与过期function enc(s: string): Uint8Array { return new TextEncoder().encode(s) }

async function hmacSha256(key: CryptoKey, data: string): Promise<string> {

const raw = await crypto.subtle.sign('HMAC', key, enc(data))

const u = new Uint8Array(raw)

let s = ''

for (let i = 0; i < u.length; i++) s += String.fromCharCode(u[i])

return btoa(s).replace(/\+/g,'-').replace(/\//g,'_').replace(/=+$/,'')

}

async function importHmacKey(secret: ArrayBuffer): Promise<CryptoKey> {

return crypto.subtle.importKey('raw', secret, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])

}

type Token = { target: string; exp: number; sig: string }

async function signToken(target: string, exp: number, key: CryptoKey): Promise<Token> {

const payload = target + '|' + String(exp)

const sig = await hmacSha256(key, payload)

return { target, exp, sig }

}

async function verifyToken(t: Token, key: CryptoKey): Promise<boolean> {

if (typeof t.exp !== 'number' || Date.now() > t.exp) return false

if (!allowedRedirect(t.target)) return false

const payload = t.target + '|' + String(t.exp)

const s = await hmacSha256(key, payload)

return s === t.sig

}

落地建议仅允许白名单域与路径前缀外跳,默认拒绝非 `https` 与非白名单目标。短链必须包含过期时间并使用HMAC签名,过期或签名不匹配立即拒绝。审计记录外跳请求与目标域,便于发现异常行为并快速处置。验证清单目标URL是否命中白名单且为 `https`。短链是否包含过期时间并通过HMAC签名校验。外跳审计是否记录来源、目标与时间戳。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部