ホーム

へぼい日記

useServerPrepStmtsを使うのが根本解決だとはおもう。けど…?

  • 投稿者: chiba
  • 2008/12/23 火曜日 23:15:54
  • java | security

UnicodeのU+00A5問題

JavaとMySQLの組み合わせでUnicodeのU+00A5を用いたSQLインジェクションの可能性
なるほど。この問題は初耳だったので驚いた。

しかも、PreparedStatementを使っても解決されないという。この部分に非常に驚いたのでどういうことなのか少し調べてみた。

PreparedStatementとは?

mysqlにおける話としてはPrepared Statement (訳)がとてもわかりやすい。
なかでも重要なのは以下の部分だ。

PerlとJava のユーザはかなり長い間prepared statementを使って
きました。しかし、これらはクライアント側のprepared
statementでした。
クライアント側のprepared statementは同じようなセキュリティの恩恵
をもたらしますが、性能向上には至りません。でも心配いりません。
MySQL Connector/J は3.1のリリースでサーバーサイドprepared statement
をサポートします。

そして実は現在のConnector/Jの最新版(5.1.7)ではデフォルトでは「サーバーサイドprepared statement」を使っていないのである。そしてクライアントサイドのprepared statementは結局のところエスケープ関連のセキュリティ脆弱性を潜在的に抱えてしまう存在なのである。そして実際に今回の問題があった。

Connector/JでサーバーサイドのPreparedStatementを使う

jdbcのURLにuseServerPrepStmts=trueをつけるだけである。

      Connection con = DriverManager.getConnection(
        "jdbc:mysql://localhost/tokumaru?user=xxx&password=xxxx&useUnicode=true&useServerPrepStmts=true&characterEncoding=" + charEncoding)

簡単ですね。こうすることにって、U+00A5問題は発生しません。エスケープ自体どの時点でもしないわけですから。めでだしめでたし。

しかし、useServerPrepStmtsのデフォルト変更問題が

useServerPrepStmtsのここの説明ではデフォルトがtrueになっているが、これは上述の通り嘘である。ちなみに英語マニュアルをみるときちんとfalseになっている。これにはuseServerPrepStmtsの登場時(Connector/J 3.1.0)にはデフォルトがtrueだったが、5.0.55.1.0においてfalseに変更されたという経緯があるためのようだ。そしてなぜfalseにされたかということの背景を察すると、trueにすることの弊害もありそうで、手放しでこれをtrueにすることを勧めることが少しはばかられる。これについて詳しい方がいたらぜひ説明をお願いしたいところである。

はてなブックマーク - useServerPrepStmtsを使うのが根本解決だとはおもう。けど…?

そろそろCakePHPについて一言言っておくか

  • 投稿者: chiba
  • 2008/12/7 日曜日 5:18:14
  • php

前回のエントリを見てくれた人がCakePHPのtracにこれ脆弱性じゃね?ってチケットを立ててくれたよ!で、見に行ってみたらCakePHPのエライ人がこんな回答をしてくれてたよ!

#5842(getClientIP() possiblly return false IP address)

this is not a security exploit in Cake,
but should certainly be something to be aware of when building an application.

超意訳: CakePHPの脆弱性ではありません。「仕様です」。だからアプリケーション構築するさいはちゃんと知っとくべきことだよね!

オーケー、分かった。確かにこれはCakePHPの脆弱性ではなかった。CakePHPを使っていた僕らの脆弱性だったんだ。オーケー、前言は撤回するよ。正しくはこうだったんだ。

CakePHPが許されるのは小学生までだよねー

はてなブックマーク - そろそろCakePHPについて一言言っておくか

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を送ってくれたのが異国の方だった件

1 2 3 4 5 6 7 8 9

ホーム

検索
フィード
メタ情報

ページの上部に戻る