SSRF防护机制详解与企业级隔离实践概述SSRF通过让服务器访问攻击者控制的目标资源以窃取内网数据或元数据。通过地址段阻断、允许名单与出口代理可显著降低风险。地址段阻断与解析const privateCidrs = [

'10.0.0.0/8',

'172.16.0.0/12',

'192.168.0.0/16',

'127.0.0.0/8',

'169.254.0.0/16',

'::1/128',

'fc00::/7'

]

function parseAndValidateUrl(input: string, allowSchemes: string[], allowHosts: string[]): URL | null {

try {

const u = new URL(input)

if (!allowSchemes.includes(u.protocol.replace(':', ''))) return null

if (allowHosts.length && !allowHosts.includes(u.hostname)) return null

return u

} catch {

return null

}

}

DNS与IP校验async function resolveAndCheck(host: string): Promise<boolean> {

const ips = await dnsLookupAll(host)

for (const ip of ips) {

if (isPrivate(ip)) return false

}

return true

}

function isPrivate(ip: string): boolean {

return matchCidrs(ip, privateCidrs)

}

出口代理与网段隔离async function safeFetch(u: URL, opts: { timeoutMs: number; maxBytes: number }): Promise<ArrayBuffer | null> {

const ctl = new AbortController()

const t = setTimeout(() => ctl.abort(), opts.timeoutMs)

const res = await fetch(u.toString(), { signal: ctl.signal })

if (!res.ok) return null

const reader = res.body!.getReader()

let read = 0

const chunks: Uint8Array[] = []

while (true) {

const { value, done } = await reader.read()

if (done) break

read += value.length

if (read > opts.maxBytes) return null

chunks.push(value)

}

clearTimeout(t)

return concat(chunks)

}

云环境元数据保护默认阻断对 `169.254.169.254` 等元数据地址的访问必要场景通过受控代理并最小字段暴露记录访问尝试并触发高优先级告警运维与测试对外访问统一走出口代理并按CIDR过滤启用DNS固定与解析结果校验,防止重绑定在集成测试中覆盖私网/环回/链路本地与元数据地址该方案在常见Web与微服务场景下可达成稳健的SSRF防护与隔离。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部