Help us understand the problem. What is going on with this article?

[JS] JavaScriptでIPアドレス計算をしたい!!

More than 3 years have passed since last update.

経緯としては、アクセス制御を行いたいわけです。
クライアントサイドで。
何言ってるの?と思う方もいらっしゃるでしょうが、ちょっと必要に駆られたのです。
仕方ないことなのです。
要件定義はいつも無情です。
(何度も言うようですが、仕事としてコードを書いてるわけではありません。悪しからず。)

IPアドレスとバイナリー

IPアドレスはそもそも2進数なのでパソコンに云わせればそちらのほうが扱いが長けています。
当然ですね。

というわけでそんなコードを書いた人がいるにはいますが残念ながらNode.jsの方です。
npm - ip

私が言うのもなんですが、よく出来てますね。
クライアントサイド側にリコーディングできなくはないのでしょうが、時間がかかりますね。

次のアプローチとしてはphpで云うところのip2longとlong2ip的な関数があればなんとかjsでも書けるのではないかと思いました。

そんなわけで色々探してみると、あるもんですね。
php.js

なんかすごそうなライブラリーですね。
この中のネットワークの実装の中にip2longとlong2ipのラッパー関数が存在します。
ip2long
long2ip

この2つを使わせていただきましょう。
これで準備は完了です。

分かるものが分かればなんとかなる

アクセスしてきたIPアドレスのネットワークアドレスとブロードキャストアドレスがわかれば、許可している範囲内かどうかわかるのでその線でいきましょう。

network.js
var ip = '192.168.0.76';
var netmask = '255.255.255.248';

function nwAddress(ip, netmask) {
    return long2ip(ip2long(ip) & ip2long(netmask));
}
// '192.168.0.72'

function bcAddress(ip, netmask) {
    return long2ip(ip2long(ip) | (ip2long(netmask) ^ ip2long('255.255.255.255')));
}
// '192.168.0.79'

ネットワークアドレスとブロードキャストアドレスがわかれば、サブネットマスクから注目すべきオクテットを割り出し、後はintに直して大小比較でいけそうですね。

計算部分に関しては書籍を読みあさってみてください。
IPアドレスはAND、OR、XOR、NOTであれやこれやすると面白いことになります。

今回は短めです。
ちなみに、PHPでやったほうが普通はいいと思います。

追記

ネットワークアドレスとブロードキャストアドレスがわかれば、サブネットマスクから注目すべきオクテットを割り出し、後はintに直して大小比較でいけそうですね。

などと書いたのですが、XORで検算して判定すればいいじゃんと友人に言われて、まぁそうだよねとなったので追記。

network.js
//ipとnetmaskは上記と同じです。

function ipControll(check_ip) {

    if (check_ip !== long2ip(ip2long(check_ip))) {
        check_ip =  '0.0.0.0'
    }

    var nw_ip = ip2long(nwAddress(ip, netmask))
    var check_ip_long = ip2long(check_ip)

    if (nw_ip ^ check_ip_long === 0) {
        return true
    } else {
        return false
    }
}

こんな感じですかね。
 
 
 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした