経緯としては、アクセス制御を行いたいわけです。
クライアントサイドで。
何言ってるの?と思う方もいらっしゃるでしょうが、ちょっと必要に駆られたのです。
仕方ないことなのです。
要件定義はいつも無情です。
(何度も言うようですが、仕事としてコードを書いてるわけではありません。悪しからず。)
IPアドレスとバイナリー
IPアドレスはそもそも2進数なのでパソコンに云わせればそちらのほうが扱いが長けています。
当然ですね。
というわけでそんなコードを書いた人がいるにはいますが残念ながらNode.jsの方です。
npm - ip
私が言うのもなんですが、よく出来てますね。
クライアントサイド側にリコーディングできなくはないのでしょうが、時間がかかりますね。
次のアプローチとしてはphpで云うところのip2longとlong2ip的な関数があればなんとかjsでも書けるのではないかと思いました。
そんなわけで色々探してみると、あるもんですね。
php.js
なんかすごそうなライブラリーですね。
この中のネットワークの実装の中にip2longとlong2ipのラッパー関数が存在します。
ip2long
long2ip
この2つを使わせていただきましょう。
これで準備は完了です。
分かるものが分かればなんとかなる
アクセスしてきたIPアドレスのネットワークアドレスとブロードキャストアドレスがわかれば、許可している範囲内かどうかわかるのでその線でいきましょう。
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で検算して判定すればいいじゃんと友人に言われて、まぁそうだよねとなったので追記。
//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
}
}
こんな感じですかね。