Heroku部署的MERN应用遭同IP高频自动化请求攻击,如何拦截?
拦截Heroku上MERN应用的恶意自动化请求
1. 自定义Express中间件拦截异常请求
后端基于Express的话,写个前置中间件直接挡掉带非法内容的请求:
- 拦截请求路径或参数里的
.php这类不属于你应用的后缀 - 拦截格式异常的
key参数(比如示例里以if开头的内容)
示例代码:
// 放在所有路由注册之前执行 app.use((req, res, next) => { // 拦截含.php的请求路径或key参数 if (req.path.includes('.php') || req.query.key?.includes('.php')) { return res.status(403).send('Forbidden'); } // 拦截以if开头的异常key if (req.query.key?.startsWith('if')) { return res.status(403).send('Forbidden'); } next(); });
2. 给请求加频率限制
用express-rate-limit包限制同一IP的请求次数,防止短时间内的批量攻击:
- 安装依赖:
npm install express-rate-limit - 配置并应用到所有路由:
const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15分钟统计周期 max: 100, // 每个IP最多允许100次请求 message: '请求太频繁,请稍后再试' }); // 关键:Heroku用转发IP,开启信任代理才能拿到真实客户端IP app.set('trust proxy', true); app.use(limiter);
3. 直接在Heroku后台拉黑恶意IP
如果所有恶意请求都来自同一个IP,直接在Heroku后台拉黑:
- 进入对应应用的Heroku Dashboard,找到
Settings->Security - 在
IP Blocklist里添加目标IP,彻底阻止该IP的所有请求
4. 严格校验接口参数合法性
针对受攻击的/get-spot-by-type-key接口,明确校验参数的合法性:
- 限制
type只能是你应用预设的合法值 - 用正则校验
key的格式(比如字符范围、长度)
示例代码:
app.get('/get-spot-by-type-key', (req, res) => { // 预设合法的type值 const validTypes = ['business', 'residential']; if (!validTypes.includes(req.query.type)) { return res.status(400).send('无效的类型参数'); } // 校验key的格式(示例:仅允许字母数字,长度12-20) const validKeyRegex = /^[a-zA-Z0-9]{12,20}$/; if (!validKeyRegex.test(req.query.key)) { return res.status(403).send('无效的密钥参数'); } // 执行正常业务逻辑 });
内容的提问来源于stack exchange,提问作者Noa
相关产品推荐
相关产品推荐

