【问题标题】:NodeJS (General JS) comparing IP addressNodeJS(通用JS)比较IP地址
【发布时间】:2013-06-16 14:47:32
【问题描述】:

我正在使用以下代码比较返回的 IP 地址(使用类似于 express 的 node-restify):

var checkIP = function (config, req) {
    var ip = req.connection.remoteAddress.split('.'),
        curIP,
        b,
        block = [];
    for (var i=0, z=config.ips.length-1; i<=z; i++) {
        curIP = config.ips[i].split('.');
        b = 0;
        // Compare each block
        while (b<=3) {
            (curIP[b]===ip[b] || curIP[b]==='*') ? block[b] = true : block[b] = false;
            b++;
        }
        // Check all blocks
        if (block[0] && block[1] && block[2] && block[3]) {
            return true;
        }
    }
    return false;
};

config.ips 包含一个数组,该数组(从代码中应该很明显)可以是特定的或通配符的 IP。

这可行,但似乎有一种更有效的方法可以做到这一点。只是好奇是否有人对简化此操作或使其更有效的方法有任何建议。当我介绍这个时,我的请求时间几乎翻了一番,如果可能的话,我想挤出一些加载时间。

【问题讨论】:

    标签: javascript arrays node.js comparison


    【解决方案1】:

    如果我的直觉是正确的,你现在可能正在做很多额外的工作:

    对于 config.ips 数组中的每个 IP 表达式,您的代码正在解析和比较:

    if (block[0] && block[1] && block[2] && block[3]) {
            return true;
     }
    

    ^^^ 请注意,您已经完成了在每个 IP 计算此表达式 4 次的迭代中获取所有 4 个块:(curIP[b]===ip[b] || curIP[b]==='*'),因此上面的 ANDing 并没有阻止已经发生的工作的开销无论如何。

    我有两个想法给你:

    1. 既然 IP 地址无论如何都是字符串,那么 * 符号本身就适合正则表达式来完成这项工作,而不是您的拆分和比较?所以也许下一步你可以考虑实现一个正则表达式来完成这项工作,而不是 .split() 并比较,然后测试它的性能?

    2. 或者也许想出如何避免与始终比较部分相关的开销,并尽可能比较整体?然后只在必要时才重新比较零件。 如果你想阅读一些 C 代码,这里是 Apache does IP blacklisting 在幕后的方法。查看名为in_domain 的函数以获得一些灵感。

    祝你好运,希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2021-01-10
      • 2010-11-04
      • 2012-08-26
      • 2014-08-04
      • 2014-03-06
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多