限制请求频率,防刷最直接
你有没有遇到过某个小程序突然卡得不行?点半天没反应,一刷新又好了。这种情况,很多时候就是背后API被人猛刷导致的。比如有人写个脚本,一秒发几百个请求,服务器扛不住就崩了。所以最常见的防护手段就是限流——规定每个用户单位时间最多能调用多少次。
举个例子,你可以给每个API接口设置每分钟最多50次请求。超过这个数,后面的请求直接返回429状态码,告诉对方“慢点来”。这种机制就像超市门口限流,人太多就排队,避免里面挤爆。
\# Nginx配置示例:限制每秒10个请求,突发允许20个\nlimit_req_zone \$binary_remote_addr zone=api_limit:10m rate=10r/s;\n\nlocation /api/ {\n limit_req zone=api_limit burst=20 nodelay;\n proxy_pass http://backend;\n}身份认证不能少
开放的API就像没有门锁的房间,谁都能进。加个钥匙就能解决大部分问题。常见的做法是给调用方分配唯一的API Key,每次请求都得带上。服务器验证Key合法才处理请求。
有些系统还会用更复杂的OAuth 2.0机制,比如微信公众号调用微信API时就得先拿access_token。这种方式虽然麻烦点,但安全性高得多,适合涉及用户数据的场景。
关键是要把Key藏好。别把密钥写在前端代码里,否则别人抓个包就全看到了。应该由后端服务统一管理,前端只负责传参。
IP黑名单和行为分析
总有那么些人想钻空子。比如注册一堆账号,轮着调用API。这时候光靠Key就不够用了。得结合IP地址一起看。如果一个IP短时间内发起大量请求,不管它有多少个Key,直接拉黑。
还可以加点智能判断。比如正常用户不会一秒钟连点50次提交按钮,这种行为明显异常。系统可以临时封禁,或者要求验证码验证。就像银行发现你账户异地频繁转账,会先打电话确认一样。
参数校验和数据过滤
有些人不走正常路,专往接口里塞奇怪的数据。比如注册接口本来只要邮箱和密码,结果传过来一堆脚本代码,想搞注入攻击。服务器必须对每个参数做检查,长度、格式、类型一个都不能马虎。
特别是涉及数据库操作的接口,一定要用预编译语句,避免SQL拼接。上传文件的接口更要小心,限制类型和大小,防止有人传个木马程序上来。
\# Python Flask 示例:简单参数校验\n@app.route('/api/user', methods=['POST'])\ndef create_user():\n data = request.get_json()\n email = data.get('email')\n password = data.get('password')\n \n if not email or '@' not in email:\n return {'error': '邮箱格式不对'}, 400\n \n if len(password) < 6:\n return {'error': '密码太短'}, 400\n \n # 继续处理...日志监控及时响应
再好的防护也可能被绕过。关键是要知道什么时候出了问题。记录每一次API调用的时间、来源IP、使用的Key、请求参数等信息,定期查看有没有异常波动。
比如平时每天调用一万次,今天突然涨到十万次,那肯定有问题。系统可以自动发告警邮件,让技术人员第一时间处理。就像家里装了摄像头,小偷来了也能马上发现。
有些公司还会用ELK(Elasticsearch + Logstash + Kibana)这类工具做可视化分析,一眼看出流量高峰和可疑行为。