如何在Express中进行IP白名单?

时间:2017-05-09 09:27:22

标签: javascript node.js express

我需要阻止每个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.

任何帮助?

2 个答案:

答案 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");
});