我需要阻止每个IP地址访问我的网站,除了我自己提供的一两个IP。我尝试过很多模块但似乎没什么用。
var express = require('express')
var AccessControl = require('express-ip-access-control');
var app = express()
app.get('/', function (req, res) {
res.send('Hello World!')
})
var middleware = AccessControl(options);
app.use(AccessControl(options));
var options = {
mode: 'deny',
denys: [],
allows: ['**8.1**.1.**'],
forceConnectionAddress: false,
log: function(clientIp, access) {
console.log(clientIp + (access ? ' accessed.' : ' denied.'));
},
statusCode: 401,
redirectTo: '',
message: 'Unauthorized'
};
app.listen(3000, function () {
console.log(' app listening on port 3000!')
})
从上面的代码运行和访问我的网站我得到控制台消息
::ffff:127.0.0.1 accessed.
::ffff:127.0.0.1 accessed.
::ffff:127.0.0.1 accessed.
::ffff:127.0.0.1 accessed.
任何帮助?
答案 0 :(得分:3)
您需要在之前定义options
。否则,您将undefined
传递给app.use(AccessControl(options))
。
不确定这是如何为您编译的,但在脚本顶部添加以下行可能有助于显示一些有用的错误。
'use strict';
其次,根据express-ip-access-control文档:
'allow'
模式(Whilelist):默认情况下拒绝,仅允许白名单中的IP(
allows
),而不会被黑名单(denys
)排除。
所以将options.mode
从'deny'
更改为'allow'
。
答案 1 :(得分:0)
您只需添加自己的用于检查IP的中间件,而无需包含其他模块。
您可以使用req.connection.remoteAddress
查看请求中的IP。
在定义路线之前,请添加以下内容:
// Custom Middleware
app.use((req, res, next) => {
let validIps = ['::12', '127.0.0.1']; // Put your IP whitelist in this array
if(validIps.includes(req.connection.remoteAddress)){
// IP is ok, so go on
console.log("IP ok");
next();
}
else{
// Invalid ip
console.log("Bad IP: " + req.connection.remoteAddress);
const err = new Error("Bad IP: " + req.connection.remoteAddress);
next(err);
}
})
如果输入了无效的IP,这将引发错误。在所有路由下方,添加以下内容:
// Error handler
app.use((err, req, res, next) => {
console.log('Error handler', err);
res.status(err.status || 500);
res.send("Something broke");
});