咱干了十几年CDN运维,见过最多的误会,就是把UA黑白名单当成什么高深的安全大招,说白了,这玩意儿就是你家小区门口的“门禁刷卡机”——只不过认的不是人脸,而是你进门时喊的那句“我是谁”。
UA是啥?一句话:你浏览器自报家门的那张小纸条。

UA黑白名单,CDN界的门禁卡,别让伪装者混进来!
每次你打开网页,你的浏览器或手机App都会自动在请求头里塞一个“User-Agent”字段,翻译成人话就是:“我是Chrome浏览器,我是Android手机,我是个Python爬虫,我是……”,服务器和CDN节点一瞧这纸条,就知道来的这位大概是什么“物种”。
UA黑白名单,就是在CDN节点上设置一张“准入名单”和“禁入名单”,黑名单:看见纸条上写着“喂,我是坏蛋”,直接拒之门外,白名单:只有纸条上写着“我是家里人”的才放行,其他的统统吃闭门羹。
原理讲透:为什么这张纸条能当门禁用?
因为CDN节点在转发请求之前,会先检查HTTP头里的User-Agent字符串,如果你配置了黑名单,CDN就会把这个字符串和你设置的黑名单规则做匹配,一旦匹配上,直接返回403,连源站的门都不让摸,白名单则反过来,只有匹配上“好人名单”的请求才被放行,其他的一律挡在门外。
这就像小区门口保安:黑名单是“那个穿红衣服的骗子不许进”,白名单是“只有穿蓝制服的本小区居民能进”,但记住,这认的是“衣服”,不是“人”。
应用场景:这破玩意儿到底能干啥?
最实用的场景就是“拦爬虫”,比如你有个网站,天天被某些脚本爬数据,跑得比你家狗还勤快,你一看日志,好家伙,UA全是 python-requests 或者 Go-http-client,这时候你直接在CDN后台把这两个UA拉黑,世界立刻清净一大半,不用动源站,连黑客都懒得跟你纠缠。
另一个常见场景是“保护API接口”,比如你做了一个手机App,后端接口只给自家App用,不想让网页端随便调,你可以设置UA白名单,只放行你App内置的那个独特UA字符串,这样别人用浏览器或者命令行来访问,直接碰一鼻子灰。
案例说明:我亲手干过的一件“蠢事”
有一回,一个客户哭着来找我,说他们搞了个抽奖活动,结果被黄牛用脚本刷爆了,我一看日志,好家伙,UA全是 okhttp/3.14,一看就是Android脚本,我大手一挥,在CDN上把 okhttp 全拉黑,五分钟后,黄牛确实没了,但客户的老板手机也打不开页面了——因为老板的安卓手机浏览器内核,某些UA里也带着 okhttp 的子串,被我一刀切误伤了。
这就是UA黑白名单最大的坑:UA这玩意儿是自报家门,伪造起来比孙悟空变个苍蝇还容易。 你能拉黑 python-requests,人家换一行代码改成 Mozilla/5.0 就能骗过你,你能白名单只放行自家App的UA,可别人随便用个抓包工具就能把UA改成一模一样,照样进得来。
常见误区纠正:别拿它当保险柜锁!
我见过最离谱的想法,是有人觉得配上UA白名单就安全了,CDN都不用加防火墙,醒醒吧!UA黑白名单顶多算个“初级门卫”,它防的是“懒得伪装”的普通爬虫,防不住“有心伪装”的高级玩家,你要是真碰上专门搞你的,人家分分钟把UA改成百度的爬虫,你还能把百度也拉黑?
还有个大误区:很多人以为黑名单比白名单好使,白名单更容易误伤,因为你永远不知道正常用户的浏览器会发什么奇奇怪怪的UA,你只放行Chrome和Safari,结果某个用老旧IE上你网站的大爷就被关在门外了,黑名单呢,又容易漏,所以务实的做法是:黑名单用来拦明面上的流氓,白名单只用来保护特定的小范围接口,别把整个网站都套上。 真正的安全,还得靠行为分析、IP信誉、验证码、频率限制这些“组合拳”。
最后啰嗦一句:UA不仅仅是“User-Agent”那串字母,它的大小写、版本号、空格都可能影响匹配,而且移动端和PC端UA格式差别很大,配名单时候多长个心眼,别像那个客户一样,把老板也给“误杀”了,记住了,这玩意儿就是个“门禁卡”,认卡不认人,但卡片可以复制,系统可以伪造,你就当它是道篱笆墙,别当成铜墙铁壁。
发表评论