前端错误报告与崩溃分析安全治理(Source Map/采样/脱敏)最佳实践概述前端错误上报需兼顾敏感信息保护与可定位性。采用采样、脱敏与受控的Source Map解析可在降低隐私风险的同时提供有效诊断。采样与节流class Sampler {
rate: number
windowMs: number
hits: number[] = []
constructor(rate: number, windowMs: number) { this.rate = rate; this.windowMs = windowMs }
allow(): boolean {
const now = Date.now()
this.hits = this.hits.filter(t => now - t < this.windowMs)
if (this.hits.length >= this.rate) return false
this.hits.push(now)
return true
}
}
字段脱敏function redactErrorPayload(payload: Record<string, any>): Record<string, any> {
const sensitive = ['email', 'token', 'authorization', 'cookie']
const out: Record<string, any> = {}
for (const k of Object.keys(payload)) {
out[k] = sensitive.includes(k.toLowerCase()) ? '***' : payload[k]
}
return out
}
受控Source Map解析import { SourceMapConsumer } from 'source-map'
async function resolveStack(stack: string, mapContent: string): Promise<string[]> {
const consumer = await new SourceMapConsumer(mapContent)
const lines = stack.split('\n')
const result: string[] = []
for (const line of lines) {
const m = line.match(/(.*)\((.*):(\d+):(\d+)\)/)
if (m) {
const pos = consumer.originalPositionFor({ line: Number(m[3]), column: Number(m[4]) })
result.push(`${pos.source}:${pos.line}:${pos.column}`)
} else {
result.push(line)
}
}
consumer.destroy()
return result
}
统一错误模型type ErrorEventPayload = { name: string; message: string; stack?: string; url: string; ua: string; traceId: string }
function buildErrorEvent(e: Error, url: string, ua: string, traceId: string): ErrorEventPayload {
return {
name: e.name,
message: e.message,
stack: e.stack?.split('\n').slice(0, 15).join('\n'),
url,
ua,
traceId
}
}
运维要点启用采样与窗口节流,避免报告风暴上报前进行字段脱敏与堆栈截断Source Map仅在受控环境解析,避免将源码暴露给客户端通过采样、脱敏与受控解析,可实现安全可控的前端错误报告体系。

发表评论 取消回复