MySQLでIPアドレスを扱うときのメモ

お久しぶりです。
といっても、まだひと月もなってないんですね。
・・・・・ブログの更新間隔の間隔が、かなり鈍ってる気がしますが、気のせいですね。

今日は、 MySQL で IPアドレス を扱う場合に参考にしたい情報を見つけたので、メモ程度に記事にしてみます。

php+MySQL でプログラムを組んでいくと、ログイン認証の仕組みを作ることがありますよね。

普段サービスを使うときは、メールアドレス(または、ユーザーID)とパスワードを入力したら、勝手にログインできた。
てな感じで、その認証の中身を意識することはほとんどありません。

今回、その「認証の仕組み」についてはお話しませんが、
大抵のサービスにおいては、最後にログイン認証が行われたときのユーザーの IPアドレス を記録しています。
(個人でサービスを作られてる場合は、省略されることもあります。 ・・・・・どっちとも言えない?)

その、 IPアドレス の記録の仕方について、お話します。

1. IPアドレスの形式

言わずとも知ってると思いますが、 現在主流の IPv4方式 における IPアドレスは、
0.0.0.0 ~ 255.255.255.255
で表されます。

2. テーブルへ記録する場合

では、IPアドレスをテーブルへ記録しましょう。
このときに、テーブルをどのように設計するとよいでしょうか。

文字数的には 7~15文字。
varchar(16) あたりが妥当ですかね。
char(16) でもよいかもしれません。

・・・・・・ところがどっこい、今回は上記の型は利用しません。

3. 今回見つけた記録方法

いよいよ本題です。
今回は、 varchar でも char でもなく、 int型で記録したいと思います。

「ぇ、IPアドレスには “.” が含まれてるけどいいの?数値型じゃなくない?」
と思ったあなた。あなたは正しいです。

確かにそのままでは記録できません。
IPアドレスの形 → 数値 への変換が必要です。

その役割をしてくれるのが・・・・・

INET_ATON(“{IPアドレス}”)

これは、 MySQLに準備されている関数です。
先ほど紹介したように、IPアドレス を、数値へ変換してくれます。
では、サンプルを実行してみましょう。

SELECT INET_ATON("192.168.0.35");

結果: 3232235555

確かに数値型に変換されています。
でも、実際に目で見る上では、見慣れた IPアドレス の形がいいですね。

INET_NTOA({数値});

という訳で逆変換です。
この関数に先ほどの値を突っ込むと、再び IPアドレス の形へ変換してくれます。
では、サンプルです。

SELECT INET_NTOA(3232235555);

結果: 192.168.0.35

これら2つの関数により、変換・逆変換が可能です。

無駄に変換してロスにならないのか?
わざわざ数値型にするメリットは何か?
無駄?

一応メリットはあります。

まず、隣接するIPアドレスを数値に変換してみます。
例: 192.168.0.36 → 3232235556

お気づきかと思いますが、IPアドレスが隣接しているので、数値型に変換された場合でも変換された値は隣接しています。
これは、携帯電話向けの認証を実装する場合にあると、大変便利です。

携帯電話で「かんたんログイン」ってボタンを見ることがよくありますよね。
ボタンを押すと「端末固有情報が・・・・・」という文言の、アラートが出ます。

ここで送信された端末固有情報を元に、アカウント情報を記録したテーブルの検索を行うのですが、ひとつ留意すべき事項があります。

成りすましが出来てしまう。

この、端末固有情報。 成りすましが出来てしまいます。
実際に Firefox のアドオンを使うと、簡単になりすませてしまいます。

大問題ですよね。

そこで、端末固有情報+α の情報で認証する必要が出てきます。
それこそが、IPアドレスなのです。

携帯電話でのインターネットは、各キャリアが提供するプロキシサーバー経由で、すべてのアクセスされています。
アクセスするたびに IPアドレス が変わるのはこのあたりが理由になります。

では、本題です。
各キャリアは、大抵プロキシサーバーのIPアドレスを公開しています。

例: docomo / iモードセンタのIPアドレス帯域
+ http://www.nttdocomo.co.jp/service/developer/make/content/ip/index.html

このような形で掲載されている各キャリアのIPアドレスを何かしら、テーブルに突っ込んでおきます。
実際に認証を行うときには、端末固有情報と接続元のIPアドレスを用います。

これにより、パソコンからの成りすましをある程度抑制できます。
※完全ではありません。

話は前後しますが、各キャリアのIPアドレスは隣接していることが多いです。
そこで、数値型にして記録しておくと便利かも。
ということで、例に出しましたが・・・・・分かりづらかったですね。

反省です。

という訳で、今日は MySQL の INET_ATON 関数 と、INET_NTOA 関数をメモ程度に紹介しました。

参考文献:

+ MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.3.6.2 その他の各種関数
+ http://dev.mysql.com/doc/refman/5.1/ja/miscellaneous-functions.html

でゎ。
※間違ったことを書いてるときは、指摘していただけると幸いです。

  1. コメントはまだありません。

  1. トラックバックはまだありません。