我正在使用 Express 和 Node.JS 提供一些静态文件,我该怎么做才能防范 POST 攻击和 GET 攻击等 http 洪水?
答案1
所有请求都使用 app.use 预先捕获并注入中间件函数。在请求被跟踪到 express.static 或 app.rest(req 对象)之前使用它,在响应客户端(res 对象)之前再使用它一次。您可以更改 req、res,并可选择使用回调函数(此处名为下一个)。这就是诀窍。如果你的中间件函数从不调用下一个()回调,请求未得到处理。您可以使用中间件,计算每个 ip 每次的请求数,并决定是否提供页面。考虑一下被阻止的 ip 列表会增长,并会减慢您的应用程序。中间件需要同步才能拦截。以下是您需要的代码示例,基于 express API 文档示例:
var express = require('express'),
app = express(),
util= require(util);
app.use(express.static(__dirname + '/public'));
// a first middleware, a logger in console, just to show ip
// usefull to debug
app.use(function(req, res, next){
console.log('%s %s from %s , proxy: %s', req.method, req.url, req.ip, util.inspect(req.ips));
next();
});
// a second middleware, what u need
app.use(filterUrReq);
app.get("blah", function(req, res) {
res.send(req.url + " well served to " + req.ip)
});
app.listen(8080);
// here the middleware function, it filters by ip, if ip is clean, call next callback.
function filterUrReq (req, res, next) {
if (req.ip == "15.89.111.111") {
console.log('i dont want to serve this IP, dont call next');
} else {
console.log('ok clean ip, go to next app.use');
next();
}
}
这是 expressJS 的良好实践。http://expressjs.com/4x/api.html#app.use。也许你的问题应该在 stackoverflow 上,或者你需要一些更全球化的东西,比如失败2ban,看看有关监狱的问题。