外闻网站运营避坑指南:API工程师眼中的7大政策雷区
|
V2EX上又刷到有人问“外闻站怎么过审”,我关掉页面,捏着咖啡杯底转了半圈——杯沿有个豁口,去年春节值班时磕的,当时雨下得跟服务器日志滚屏一样匀速。 亲历现场。腊月廿三,凌晨一点十七分,IDC机房的空调嗡嗡声忽然低了八度,我抬头看见王工蹲在机柜前用手机电筒照U位标签,他左手小指缺一截,是早年焊板子烫的,现在老拿这手指抠SD卡槽。我原以为就改个Referer白名单的事,结果他刚拔出第三张卡,后台监控警报就响了——不是我们服务挂了,是上游CDN的IP段被掐了两百一十三个,连带着把我们爬虫调度队列里三百七十二个任务全标成“policy_blocked”。 那个“优胜劣汰”我敢打包票站得住。但不是说谁技术强谁活下来——是看谁先在API返回体里塞进十七种语言的403错误文案,再把error_code字段轮着换罗马数字、汉字大写、base64混排,最后还加了个X-RateLimit-Grace-Period头,值是“负七秒”。对,负数。运维老张看见直接笑出声,手抖把泡面汤洒在键盘F键上,现在按F还是咸的。 雷区一:把Content-Security-Policy当CSS来写。去年春节,我们组实习生小陈抄了份模板往nginx里一贴,把script-src设成'unsafe-inline',还带了个注释:“兼容老系统”。结果上线三小时,某浏览器扩展弹窗突然开始渲染境外新闻源的JSONP回调函数——它调用的是我们API的/crossdomain/endpoint,而这个endpoint的Content-Type响应头写着text/html;更绝的是,它居然还顺手吐出了我们内网DNS解析缓存里的二级域名列表。我查日志时听见隔壁组李主任接电话,声音挺亮:“……对,我们肯定不翻墙,但墙外的JS能自己跳进来啊。” 雷区二:User-Agent指纹化做得太细。我们原来每台爬虫节点都打上唯一UUID,再加硬件指纹:GPU型号、屏幕DPR、WebGL渲染器字符串……全塞进UA。后来审计说这是“变相设备标识”,得砍。砍完第二天,流量掉了一半——不是因为策略失效,是因为境外CDN服务商把我们所有UA里带“HeadlessChrome”的请求,全部路由到同一个边缘节点,那个节点上个月刚被邻居公司薅过羊毛,IP信誉分跌到红线以下,直接进沙箱。现在想起来,那会儿机房窗玻璃上有道水痕,一直没擦,像条歪斜的HTTP状态码。 雷区三:Cookie路径搞成了路径遍历式设计。/api/v1/news/ 下发的cookie path设成“/”,结果某天前端同事在/public/assets/目录里放了个测试HTML,里面用document.cookie读了下,发现能偷到/api/auth/token的HttpOnly字段。当然他没真偷,就是顺手console.log了一下。但这条log被日志采集系统捕获,触发了“跨域敏感数据暴露”告警规则。我那天中午外卖点的是黄焖鸡,米饭盛多了,盒盖没扣严,汤渗到笔记本键盘缝隙里,现在按Delete键偶尔会重复三次。 雷区四:忘了Origin头可以伪造。我们信了RFC里那句“浏览器强制校验”,真把CORS预检当成防火墙用了。直到有次线上故障,抓包发现某个iOS WebView容器里跑的H5页面,Origin头写着https://xss.127.0.0.1:8080,但它后端居然真信了,返回了Access-Control-Allow-Origin: https://xss.127.0.0.1:8080。这事儿是我边啃冷包子边复现出来的——包子皮裂了,露馅儿漏油,滴在抓包截图的Wireshark界面上,正好盖住TCP重传标记的位置。
文章配图,仅供参考 雷区五:Rate Limiting用客户端IP当唯一维度。这个我懒得展开,就说个细节:去年除夕夜,浙江绍兴某宽带出口的NAT池里,三百二十八台设备共享一个公网IP,其中一台是扫地机器人固件升级请求,它调用我们天气API,频率是每分钟一次。结果整个IP段的配额被机器人吃光,导致同一出口的二十家民宿预订系统全卡在登录页。事后查到,那个IP段的BGP路由标记里带着“家庭宽带_轻度使用”,我们系统里却标成“企业专线_高优先级”。雷区六:把API文档里的“示例响应”当真实接口契约用。文档里写{"code":0,"data":{"title":"XXX"}},结果实际返回{"code":"0","data":{"title":"XXX","publish_time":"2023-12-30T08:03:17+08:00"}}。类型错位、字段膨胀、时间格式乱炖。最坑是某个合作方把示例响应直接写进Android SharedPreferences当常量缓存了三天,直到他们App里出现“发布时间:0年0月0日”才报警。我查这问题时,王工正蹲着拧机柜螺丝,嘴里哼的是《难忘今宵》副歌,跑了调。 雷区七:信任JWT里aud字段不可篡改。audit组发通报那天,我在茶水间泡枸杞,水刚沸,壶嘴嘶嘶响。旁边新来的姑娘问我:“aud不是签名里带的吗?”我说是。她又问:“那要是签名人本身……”话没说完,保洁阿姨推着车进来换垃圾袋,塑料袋哗啦一声撕开,露出底下半个没吃完的草莓蛋糕,奶油塌陷成椭圆形,像极了某个被劫持的OAuth2.0授权码流图。 说到底,政策雷区不是用来绕的,是让系统暴露软肋的CT扫描仪。你修得越勤快,它照得越清楚。去年春节后我删掉了所有“兼容性适配”的TODO注释,把代码提交信息全改成“rm -rf compatibility”。没人在乎。反正今天上午九点十五分,又有个新IP段被标为policy_blocked——这次是新加坡的,AS号查了,归属某家卖二手路由器的公司。要不要加个白名单?我不知道。我只知道刚才泡的第二杯枸杞水,表面浮着三颗没泡开的干果,像三个沉默的403错误。 我现在正在改一个中间件,要把所有X-Forwarded-For字段自动转成X-Real-IP,哪怕上游根本没传。不为别的,就因为昨天发现某个云WAF的回源请求里,X-Forwarded-For是个纯数字字符串,而我们校验逻辑把它当IP段处理,结果把整段CIDR当成了单个IP地址。这事说起来挺蠢。但你知道最要命的是什么吗?我们那套校验逻辑,最早是2007年从SourceForge上扒下来的PHP库改的,作者ID叫phpgeek2003,至今没改过名。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |




