読者です 読者をやめる 読者になる 読者になる

LL PlanetsのIPv6ハッカソンとfilter_var()

LL Planets

先週の土曜日 8月20日は文京シビックホールLL Planetsでした。自分も実行委員会の一人だったので、当日は朝早く起きて荷物を運んだり、会場の映像周りのセッティングをしたりしてました。


LL Planets の出し物の一つである「IPv6ハッカソン」参加者として召喚されていたので、当日のセッションはほとんど聞けなかったのですが、参加された方々のブログ等を読むに、まるまる JavaScript 一色に近い内容だったようです。聞きたかったなー。

IPv6ハッカソン

ささけん(@)から召喚されてIPv6ハッカソンの参加者となったので、ほぼ一日裏のハック部屋でこもって作業してました。久々に触って慣れてない FreeBSD や慣れない Ubuntu に苦労しながらも、午前中でなんとか環境構築を終わらせて、私がやってみたのはIPv6環境で、実際にPHPフレームワークを動かしてみる」でした。


PHPの使われ方、特に mod_phpApache HTTPD に組み込まれて使われる方法だと、ApacheIPv6 対応さえしていれば特に何もすることはありません。ただフレームワークによっては IPv4 に依存したコードが入っているかも知れないので、そこをあぶり出してみようということです。


対象となるフレームワークは、どうせだから一度使ってみたいと思っていながら時間がなくてなかなかいじれないものにしてみました。結局以下の4つになりました。

当日発表したプレゼン資料は Slideshare に上げてあります。

Lithiumとfilter_var( )

さて、その作業中に気づいたのが Lithium の IP アドレスバリデーションをするコードの短さです。

/libraries/lithium/util/Validator.php

<?php
        'ip' => function($value, $format = null, array $options = array()) {
                $options += array('flags' => array());
                return (boolean) filter_var($value, FILTER_VALIDATE_IP, $options);
        },

実質以下だけといっても良いです。

<?php
filter_var($value, FILTER_VALIDATE_IP);

これは何だろうということで、この FILTER_VALIDATE_IP で Lithium のコードを grep したのですが、ここ以外何もヒットしません。もしやと思って PHP マニュアルを見てみると、filter_var( ) は PHP 5.2.0 から入った標準関数でした。

さまざまな type と option を渡して、その名の如く値をフィルターする関数のなのですが、前述のFILTER_VALIDATE_IPを type に指定することで、IP アドレスのバリデータとして使用できます。

<?php
$addrs = array(
    '192.168.0',
    '192.168.0.0',
    '2001:2e8:408:10::49',
    '2001:2e8:408:10:0:0:49',
    '2001:2e8:408:10::0:49',
    '2001:2e8:408:10::49:',
    '2001:2e8:408::0::49',
    '::ffff:192.0.2.128', // ipv4 mapped
    '::192.0.2.128', // ipv4 compatible
    );
foreach ($addrs as $addr) {
    $result = filter_var($addr, FILTER_VALIDATE_IP);
    var_dump($result);
}

IPv4 / IPv6 両方に対応していますし、IPv4 mapped IPv6 アドレスや、 IPv4 compatible IPv6 アドレスも対応しています。

PHP: Validate filters - Manualを見ると、以下のフラグを options に指定することでそれぞれの on/off ができるようになっているようです。

  • FILTER_FLAG_IPV4
  • FILTER_FLAG_IPV6
  • FILTER_FLAG_NO_PRIV_RANGE
  • FILTER_FLAG_NO_RES_RANGE

他のフレームワークが、様々なテクニックを駆使して IP アドレスのバリデーションを複雑なコードで実現しているのに比べて、Lithium の洗練具合は半端ないなと思いましたw