Ethnaでビット演算子って始めて知った

結構アクセスが増えてくると、セッションが上手く繋がらないことが多くなってくる。
で、Ethnaの場合だと、Ethna_Sessionクラスの_validateRemoteAddr関数が弾いているっぽい。

コメント欄で
セッションに保存されたIPアドレスとアクセス元のIPアドレスが同一ネットワーク範囲かどうかを判別する(16bit mask)
って書いてあったんだけど、よう分からんかった。

■16bitマスクについて
多分
xxx.xxx.yyy.yyy
で、xの部分(16bit分)が変わったらいかんよって事だ。
逆にyの部分(16bit分)が変わっても、同一ネットワーク範囲とするってことだ。

まあ、会社とかになると24bitのサブネットマスクとか当たり前になるので、これってセキュリティ上厳しいのか厳しくないのかようわからんけど、まあ、何でも自由ってのよりは全然良いわな。
それは間違いない。

で、意味は分かったんだけど(多分)、今度はソースが解読できない。

function _validateRemoteAddr($src_ip, $dst_ip)
{
    $src = ip2long($src_ip);
    $dst = ip2long($dst_ip);

    if (($src & 0xffff0000) == ($dst & 0xffff0000)) {
        return true;
    } else {
        $this->logger->log(LOG_NOTICE, "session IP validation failed [%s] - [%s]",
                           $src_ip, $dst_ip);
        return false;
    }
}

ip2long()とif文中にある"&"演算子。
ip2long関数は、まあすぐ調べることが出来たんだけど、"&"演算子がなかなか出てこなかった。

で、見つけた。
【 ほでなすPHP 】 PHPの基本 -> 演算子

結局「ビット演算子」ってものらしい。
ビットっていうぐらいだから、2進数でごにょごにょやるらしい。

0xffff0000の見た方がわからなかったんだけど、多分最初の0xってのは、正負の記号と見た!
んで、後ろのffff0000が32bitを表しているはず!

で、ffff0000を2進数で直すと
1111 1111 1111 1111 0000 0000 0000 0000
となる。

IPアドレスは8bit×4で32bitだから、上のにあわせると
11111111.11111111.00000000.00000000
↓
255.255.0.0
って感じになる。

んーこれって数学?

つまりのところ、このif分は、fの部分の16bit分がマスク扱いで、そこが一緒かどうかみてるってことね。
それが一緒なら、同一ネットワークですよと。

んーこうやってマスクのチェックをしていたんだなと納得。
凄いなあ、藤本さんは!
年下とは思えない・・・(涙)

さすがPHPのコミッターだなーって思ったけど、学校行って勉強した人とかにとっては普通かな?
独学の僕には新鮮だったわ。

つか、こんなの無理だわー。

コメント

アーカイブ

2012

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12

2011

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com