ホーム

へぼい日記

CakePHPのgetClientIPを使っていいのは小学生までだよねー

  • 投稿者: chiba
  • 2008/12/3 水曜日 5:44:14
  • php

PHPで開発をすることが多くなりPerlの良さを再確認している今日この頃ですが皆さんいかがお過ごしでしょうか。

さて、今日は今もっともナウいPHPのWebアプリケーションフレームワークであるCakePHPのお話を一つ。

CakePHPには組み込みコンポーネントとしてリクエストハンドラ(RequestHandler)が備わっています。
リクエストハンドリング :: 組み込みのコンポーネント :: マニュアル :: 1.2 Collection :: The Cookbook:

このRequestHandlerのメソッドであるgetClientIPが小学生には危険そうだというお話。(あ、このエントリのタイトル逆w)

まずはgetClientIPの実装コードを。(1.2を例にとっているが1.1もほぼ一緒である)
https://trac.cakephp.org/browser/trunk/cake/1.2.x.x/cake/libs/controller/components/request_handler.php

function getClientIP() {
    if (env('HTTP_X_FORWARDED_FOR') != null) {
        $ipaddr = preg_replace('/(?:,.*)/', '', env('HTTP_X_FORWARDED_FOR'));
    } else {
        if (env('HTTP_CLIENT_IP') != null) {
            $ipaddr = env('HTTP_CLIENT_IP');
        } else {
            $ipaddr = env('REMOTE_ADDR');
        }
    }

    if (env('HTTP_CLIENTADDRESS') != null) {
        $tmpipaddr = env('HTTP_CLIENTADDRESS');

        if (!empty($tmpipaddr)) {
            $ipaddr = preg_replace('/(?:,.*)/', '', $tmpipaddr);
        }
    }
    return trim($ipaddr);
}

(envの実装はbasics.php。簡単にいってしまえば$_SERVERか$_ENVから指定されたkeyの値をとってくるというところ。)
ひええ。怖いですね。小学生には使いこなすのは厳しそうですね。それではみなさんご機嫌よう。

といって終わるのも不親切なので何がどう危険なのかを少し解説。

HTTP_X_FORWARDED_FORというのはhttpヘッダのFORWARDED_FORX-FORWARDED-FORのことで、これは一般的には、匿名ではないプロキシに接続している際にプロキシサーバがアクセス先のサーバにhttpリクエストのヘッダに勝手に送信元のIPアドレスを付与しちゃうものだ。

で、このコードではそのヘッダに何か値があればそれを送信元IPアドレスとして返してしまう。

ちなみにリバースプロキシを使っている時はmod_rpafmod_extract_forwardedを使ってこのコードと同様のことをapacheレベルでやったりはする(mod_rpafとmod_extract_forwardedは置き換えのフックのタイミングが違ってたりする)。しかし決定的に違うのは、mod_rpafにしろmod_extract_forwardedにしろ、置き換えを許す送信元のプロキシのアドレスを限定する設定があるのだ。mod_rpafではRPAFproxy_ips、mod_extract_forwardedではMEFacceptがそれにあたる。ところがこのgetClientIPにはそういったコードは見当たらない。

ここで一度整理しておきたいが、phpで取得できる$_SERVER[‘REMOTE_ADDR’]はwebサーバに実際に接続してきたtcp/ipにおける送信元アドレスであり、3ウェイ・ハンドシェイクにより検証されている信頼性の高い送信元IPアドレスといえる(もちろんシーケンス番号の問題とかもあるが)。それに比べhttpリクエストヘッダに記述されるFORWARDED_FORX-FORWARDED-FORの値は、webサーバにとってはまったく検証を経ていない信頼性の低いアドレスなのである。

上記のことからわかるのはgetClientIPには任意のIPアドレスを注入できるということだ。要するにIP偽装(IP Spoofing)である。

ちなみにfirefoxであればアドオンのModify Headersなんかを使えば簡単にhttpヘッダは任意のものが作成できる。

ところで、WebアプリケーションにおいてIP偽装が問題になるのはどういう場面であろうか。それは認証に利用している場合であろう。日本に住んでいるwebエンジニアが真っ先に思いつくのは携帯の個体識別番号認証でのIPアドレスチェックではないだろうか。先日高木浩光氏に退化してゆく日本のWeb開発者と揶揄されていたが、個体識別番号認証自体を完全否定することは私にはできないが、少なくともCakePHPでモバイルサイトを構築されている方はこの件を確認していただくのがよいかとおもわれる。しかしたとえば携帯とPCでデザインを変えているだけなんて場合には影響は皆無であろう。

ちなみにこの件はCakePHP開発側に伝えるべきなのだろうか。しかしこれだけ確信的にコードに書かれていると「仕様です」という感じがしないでもない。

しかし、小学生が使うことも考慮して以下のマニュアル等には「よいこのみなさん、ここでえることのできるIPアドレスはほんとうのクライアントのIPアドレスとはちがうばあいがあるよ」ぐらいは書いておいてほしいものだ。
クライアントについての追加情報を取得する :: リクエストハンドリング :: 組み込みのコンポーネント :: マニュアル :

まぁとりあえず小学生は$_SERVER[‘REMOTE_ADDR’]を普通に使っておくとよいとおもわれる。

追記1: $_SERVER[‘HTTP_X_FORWARDE_FOR’]のhttpヘッダでのキーは”X-FORWARDED-FOR”ですた

はてなブックマーク - CakePHPのgetClientIPを使っていいのは小学生までだよねー

情けは人のためならず

ここ最近自宅で料理をするようになった。

人からもらったケンタロウのレシピ本cookpadやニコ動の料理カテゴリを活用しながらなんとかやっている。

そんなある日レシピの中に「出汁200cc」と書かれていた。「出汁」がいったいなにものなのか分からなかった私は、本をくれた知人に「デジルを200ccってあるんだけどデジルってなに?」と聞いてみた。

「…。だし、と読みますが」

「…。あぁ…。」

それはそうと先日、ホテルのバー通いが話題になっている我が国の総理が踏襲を「ふしゅう」と読んで話題になっていたが、私も4-5年前まで同様に「ふしゅう」と読んでおり気づいた時には死にたくなるほど恥ずかしい思いをしたものである。

読み間違いを指摘するのは自分自身もなんとなく気恥ずかしい。けれど、その人のために指摘してあげられるようになりたいものだ。

出汁をデジルと読む国民的アイドル木村拓哉さん(1:31あたり)

※このメタ構造はやっぱ分かりづらいと思ったので一応補足しておくとタイトルは当然誤用である。

はてなブックマーク - 情けは人のためならず

今すぐ聞くべきってわけでもない電子音楽10選

先日会社の飲み会でどんな音楽聞くの~?みたいなお決まりな会話があった。そういうときは大抵面倒なので「テクノ」とか「電子音楽全般」とか言い、「電気グルーブみたいなやつ」とか言っておく。もちろん間違いじゃないしその場での会話ではそれで充分でそれ以上は求められていないわけでそれぐらいが空気を読んだ返答であろう。しかし消化不良なのも確かだ。そこで、せっかくブログをやっているのでじゃあ具体的にはどんな曲を聞いてるのってのを紹介してみたりする。今の世の中youtubeっていう便利な道具もありますしね。(自分がアップしたわけじゃないですからね。一応w)

というわけで電子音楽以外にもロックとかポップスとかも普通に聞いたりするんですが、とりあえずは自分的カテゴリの「電子音楽全般」から好きな曲を 10曲挙げてみます。聞いてみて興味を持った方はCDなりitunesなりで買ってあげてください。ええとそれと、Perfumeは諸事情により選考対象から外しておきますw

あ、ちなみに順番は順位を表しているわけではありません。

1. Aphex Twin – On

Aphex Twinはキ●ガイなところとかドラムンベースとか実験音楽的なところとかが一般的には評価されているのかもしれないけれども、私がAphex Twin好きを公言する理由はこの曲とSelected Ambient Worksに依るものです。Donkey RhubarbWindow Licker(ちなみにここらへんのMVを好きだと公言することがカッコイイと思っていた時代が私にもありましたが今はそうではないです)とかそれなりにいいと思う曲もあるけれどもそれ以外のアルバムや曲は正直そんなに好きではありません。やはり私はメロディを重視しているんだろうなぁと。

この曲は本当に美しいメロディと暴力的なリズムのそのアンバランスさにヤられてしまいました。一時期はこの曲を延々とループしながら徹夜仕事を繰り返していました。順番と順位は関係ないと書きましたがこの曲だけは正直別格で自分の音楽史で1曲あげろといわれたら迷わずこの曲をあげることになるでしょう。 Aphex Twinだと他にはSelected Ambient Worksの一曲目のXtalあたりが好きです。というかこのアルバムはすべて好きですね。ちなみに私はAmbient worksⅡのほうがちょっと駄目だったタイプです。

2. 電気グルーブ – 虹

電気グルーブの超名曲。AphexTwinのOnに対する個人的な歴史的経緯がなければ文句なくこの曲が一位です。美しいメロディと歌声。このyoutubeにあるように五島良子がちゃんと歌ってるバージョンが好きです。WIRE 99 COMPILATION にもはいってます。あーWIREいきてー。

3. Orbital – Chime

こんなテクノがあるのか!なんてポップなんだ!と思った曲です。今だに私はこの曲以上にインパクトのあるテクノを知りません。この曲はOrbital本人達を含めRemixが多々されているのでこのyoutubeのもOriginalなのかどうかもよくわかりませんw

4. Orbital – Halcyon & on & on

Orbitalといったらこの曲っていう人は結構多いんじゃないですかね。自分が好きな曲には珍しい踊れるアンビエント(chill out?)です。元ネタ(リバースしてる)がOpusⅢのIt’s A Fine Dayっていうのは有名ですね。

5. The Orb – Little fluffy cloud

少し前にフォルクスワーゲンのCMで使われていたのが記憶に新しい人も多いですかね。女性の印象的なヴォーカルが入ってる曲が好きなのは自分の特徴の一つかもしれません。The OrbではほかにはToxygeneとかも好きですね。

6. The KLF – Justified & Ancient

このリストの中ではかなり異色(w)の曲ですね。ラップとテクノが融合してます。KLFといったらChill Out(ちなみに最近Pink FloydのAtom Heart Motherを買ってジャケだけじゃなくて内容もオマージュなんだなぁと理解しました。)という人は多いでしょうが、あえてこの曲を選曲ということで。一時期ネット上で「むーむー」いいまくってたのはこの人たちの影響です。

7. 808 State – Pacific State

マンチェキタ━━━━(゜∀゜)━━━━ッ!!
マンチェが生んだテクノスターですよ。New Orderとかは正直よくわからないので808 Stateですよ。

8. DE DE MOUSE – baby’s star jam

2008年に、久しぶりに衝撃を受けた曲。本当はsunset girlsのsunset slopeっていう曲のほうが好きなんですが、youtubeにはないようなので。(こちらで視聴はできますね)

9. Derrick May(Rhythim Is Rhythim) – Strings of life

日本人以外すべてUKという偏った選曲になってしまったので(やはりとある人の影響をうけまくってるんだなぁ自分)、デトロイトから1曲。この曲はテクノのマスターピースですね。

10. YMO – The End Of Asia

YMOの曲はほとんど好きですが、このリストに合わせるとこの選曲になるでしょうか。(元は教授のソロだけど)今だに色褪せないサウンドという感じがさすがですね~。

まぁこんな感じです。この曲も好きなんじゃないかな!というお薦めあったらぜひ教えてくださいです。では。

はてなブックマーク - 今すぐ聞くべきってわけでもない電子音楽10選

KORG DS-10

KORG DS-10
キターーーーーーーーー
amazon限定販売の噂のKORG DS-10です。きました。はじめてのしんせさいざーです。
さっそく少しいじってみたけどいやー面白いなぁ。しんせさいざーって。でも難しいですね。とりあえずOrbitalのChimeあたりを打ち込んでみて練習してみようかと思います。

はてなブックマーク - KORG DS-10

perl-mongers.orgのメール送信の記事にちとつっこみ

  • 投稿者: chiba
  • 2008/5/30 金曜日 2:58:51
  • perl

はてブのほうでちょろっと書いたんだけど、
Mail::Sendmail でメール送信の以下のコードについて。

use Encode;
use utf8;

my $subject = "テスト";
my $message = "テストです。ほげほげ。";

foreach my $str ( $subject, $message ) {
    utf8::encode($str);
    Encode::from_to( $str, "utf8", "iso-2022-jp" );
}

ここでutf8::encode => Encode::from_toするのは冗長

encode('iso-2022-jp', $str);

だけでおk。
use utf8してなければ(で、ソースの文字コードがutf8であれば)

Encode::from_to( $str, "utf8", "iso-2022-jp" );

だけでおk。
http://b.hatena.ne.jp/kamawada/20080530#bookmark-8776610

encode('iso-2022-jp', $str); しても結局メールを送るときにutf8フラグを落とさなきゃいけないので

といってますがそれは勘違いかと・・・。
EncodeのPODのencodeの説明のところにも

the UTF8 flag for $octets is always off

とかかれていますし。

以下確認コードでっす。

#!/usr//bin/perl
use strict;
use utf8;

use Encode;
use Devel::Peek;

my $str = 'あああいうえお';

print Dump($str);
print Dump(simple_encode($str));
print Dump(encode_from_to($str));

sub simple_encode {
    my $str = shift;

    return encode('iso-2022-jp', $str);
}

sub encode_from_to {
    my $str = shift;

    $str = encode('utf8', $str);
    Encode::from_to($str, 'utf8' => 'iso-2022-jp');
    return $str;
}

結果はこちら

SV = PV(0x8151b00) at 0x815160c
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8)
  PV = 0x81fefb0 "343201202343201202343201202343201204343201206343201210343201212"� [UTF8 "x{3042}x{3042}x{3042}x{3044}x{3046}x{3048}x{304a}"]
  CUR = 21
  LEN = 24
SV = PVMG(0x81e1fc8) at 0x8230ca0
  REFCNT = 1
  FLAGS = (TEMP,POK,pPOK)
  IV = 0
  NV = 0
  PV = 0x8236630 "33$B$\"$\"$\"$$$&$($*33(B"�
  CUR = 20
  LEN = 24
SV = PVMG(0x81e2028) at 0x8230ca0
  REFCNT = 1
  FLAGS = (TEMP,POK,pPOK)
  IV = 0
  NV = 0
  PV = 0x8236630 "33$B$\"$\"$\"$$$&$($*33(B"�
  CUR = 20
  LEN = 24

ま、まったくおなじものですねー。

はてなブックマーク - perl-mongers.orgのメール送信の記事にちとつっこみ

ex_autocmd.jsにCurrentPageLoad追加とTabLeaveの修正

先日行ったautoIgnoreKeyのDOMContentLoadedの挙動修正ですがはてぶのほうで「ex_autocmd.jsにも適用できると夢が広がりそうだ」といわれていたのでやってみました。

とはいっても

autocmd PageLoad http://reader.livedoor.com/reader.* js liberator.modes.passAllKeys=true;
autocmd TabSelect http://reader.livedoor.com/reader.* js liberator.modes.passAllKeys=true;
autocmd TabLeave http://reader.livedoor.com/reader.* js liberator.modes.passAllKeys=false;

みたいに書いてた人は同様の問題はおこってなかったはず。PageLoad時の動作がldr限定なので。ただし逆にldrをバックグラウンドで開くと関係ないページでpassAllKeysがtrueになって困るということはあったはず。
あと、TabLeaveが
* セッションからのタブ復活をした直後のタブ変更(セッションからの復活ではTabSelectはおこらず。)
* タブの削除(recentTabオブジェクトが破棄されてしまうため)
のときに元のURLが拾えずに正常に動作していなかった様子。

というわけでCurrentPageLoadの追加とTabLeaveの修正をコミットしました。

autocmd CurrentPageLoad http://reader.livedoor.com/reader.* js liberator.modes.passAllKeys=true;
autocmd TabSelect http://reader.livedoor.com/reader.* js liberator.modes.passAllKeys=true;
autocmd TabLeave http://reader.livedoor.com/reader.* js liberator.modes.passAllKeys=false;

こんな風にかくと幸せになれるです。

はてなブックマーク - ex_autocmd.jsにCurrentPageLoad追加とTabLeaveの修正

autoIgnoreKeyのDOMContentLoadedの挙動修正

こんにちはこんにちは。昨日今日といろんな大人の事情でYAPC::Asiaにいけてません><仕事よりYAPCのほうが大切だって気持ちはあるんですが・・・。うぅ・・無念です。

で、全然関係ありませんがちょっと前からFirefox+Vimperatorを活用してます。そこでLDRとかを見るときにvimキーバインドを自動で無効にしてくれる便利ぷらぎんのautoIgnoreKeyを使っていたのですが、LDRでvでフィードを開いてすぐLDRのタブに戻ってきたりするとその後DOMContentLoadedイベントが起こってLDRタブを開いてるのにもかかわらずvimキー有効になってしまっていました。

なので常に今開いているタブのURLを元に判断するように修正してコミットしましたー。これだとこういう状況でダメなんだよ!という方いらっしゃいましたら教えてください。

はてなブックマーク - autoIgnoreKeyのDOMContentLoadedの挙動修正

CodeResposに初めてコミットしたモジュールに初めてpatchを送ってくれたのが異国の方だった件

Codereposにコミットした初めてのモジュールである、「深度が一定ではない階層化されたデータをDBIx::Classで扱えるようにする」DBIx::Class::Tree::NestedSet。その使いどころがニッチすぎるためか、今までこれといったフィードバックは(予想通り)特にありませんでした。

ところが今日このモジュールに初めてpatchを送ってきてくれたのがなんと異国のKevin Bakerなる人物。コードをオープンにするっていうのはこういうことなんだなぁとちょっと感動。英語がからきし駄目な自分ですがKevinさんとコードの中で意思疎通はできたのかなぁと。

今まで異国の方にpatchを送ったことは何度かあったけど送ってもらったのは初めてで、うれしかったのでこんなエントリをたててしまった。今は反省している。

ところで、そのpatchはというとCodeReposのr7130で取り込んであります。見てもらうと分かるのですが恥ずかしいスペルミスとかを直されている部分もあったりするわけですが・・・。

はてなブックマーク - CodeResposに初めてコミットしたモジュールに初めてpatchを送ってくれたのが異国の方だった件

CodeReposにDBIx::Class::Tree::NestedSetをコミットしてみた

てなわけでRubyはやってません

がCodeReposにDBIx::Class::Tree::NestedSetをCommitしてみました。これのアルゴリズムに関しては[mysql 12071] 階層化されたデータをMySQLで扱うを参照ということで省略。ここに書いてあるのと違う点としては、親ノードの付け替え用にmvgフラグを必要としています。(インスパイア From DBIx::OO::Tree)

メソッドはDBIx-Class-Treeパクリ準拠していますのでテストもパクリ準拠してまったく同じ(あ、mvgカラムは追加してるけど)テストを通しています。

あとはDBIx::OO::Tree,DBIx::Tree::NestedSetあたりをパクリ参考にしてみました。

でもってTODOにも書いてるのですが、rootノード取得用にResultSetManagerなメソッドを生やしたいんですがどうすればいいのかが分からない…。もうちょい調べよう。

あとDBIx-Class-TreeのTODO

– DBIx::Class::Tree::NestedSet

ってかかれてるんですがこの場合やっぱ空気読んでCPANには上げないほうがいいのでしょうか。まだCPANあげたこともないのでCPANの空気が読めません><

はてなブックマーク - CodeReposにDBIx::Class::Tree::NestedSetをコミットしてみた

Rubyをやってみる

  • 投稿者: chiba
  • 2007/9/21 金曜日 11:10:42
  • learning

ブログが3か月以上あくとさすがにもう書かないことに慣れてしまってまずい。

なんかかかなきゃなぁとおもったのですが、技術ネタを書くとどうも時間がかかってしまう性質なので…。

ブログで勉強するぞ宣言をして逃げられないようにするよメソッド発動ということで。

さて、何の勉強をするかな。本棚を探ってみると買ったまま放置しているたのしいRubyRuby on Rails入門が・・・

というわけでとりあえずRubyをいまさらながらやってみようということで。
一ヶ月ぐらいでひととおりのところをできるようになりたいなと。

とりあえず今の(大いに間違っているであろう)Rubyに対する知識

  • Rubyは全部オブジェクトらしい
  • 書くのが楽しいらしい
  • Railsも楽しいらしい
  • オブジェクトならPerlでもやってるよ
  • Javaも一時期かじってたよ
  • Jpmobile便利そう!
  • でもCPANみたいなのあるの?

さて、これが1ヶ月後どうなっているか。
随時進捗もアップする予定です。

その隙間をぬってPerlの話題もまた提供できたらいいなぁ・・・。

はてなブックマーク - Rubyをやってみる

1 2 3 4 5 6 7 8 9

ホーム

検索
フィード
メタ情報

ページの上部に戻る