携帯の簡単ログイン機能を使うには?
4月 27th
高木浩光@自宅の日記 – ここまで破綻しているケータイID認証(簡単ログイン)
http://takagi-hiromitsu.jp/diary/20100425.html#p01
携帯サイトの簡単ログイン機能に問題提起されて久しいですね。
今回も、セキュリティの専門な高木さんが指摘されています。
内容は以前から言われて事ですが、さらにつっこんだ検証をされているようです。
で、ここかがらワイのアレなんですが、
「簡単ログインを使わず全部のサイトでID/PASSでログインにすればいいんだ!」
みたいな解決策もアレじゃないですか。
だって、携帯ユーザーなんて「色んなサイトで同一ID/PASS」とか「パスワードは0000」とか「忘れた」とか「大文字小文字どころか半角全角の区別もわかんない」みたいな人多いんですよ。
若い人が多いから特に。
ということで今回は「携帯の簡単ログイン機能ってどうすれば実装してもいいのさ?」ってのを出してみるテストです。
今、問題にされてる簡単ログイン機能に関する問題点は
- 携帯端末のajaxがdomain baseなのでIPアドレスでアクセス出来ちゃうとajaxで抜き取られてしまう
- SoftbankやEmobileでPC接続時に他キャリアの個体識別情報でアクセス出来ちゃう
この2点ですよね。
たぶん。
まず[1]の脆弱性について、ようはIPアドレスでアクセスされた時にサイトにアクセス出来なければいい。
だからVirtualHostでサイトを設定するって対策がありますよね。
というか共有サーバーだと基本的にVirtualHostだし、専用サーバーなら自分で設定してるはずなので変更も可能ですよね。
それだけで防げるのでかなりお手軽。
[2]の問題は
- SoftBankなどのPC接続で携帯と同一のIPアドレスが利用される
- 他社が勝手につけたヘッダー情報まで面倒みてくれない
というのがあって適当な実装だと脆弱性(他者の個体識別情報でアクセス出来てしまう)に繋がる。
対応としては、キャリア判定と個体識別情報の取得部分をちゃんとすればいいじゃね?と思います。
高木さんは専門家なのであやふやな状態(キャリアが公式に発表していない&何してるか分からない)状況で変な事いいたくないからああいった結びになってるのかな、と妄想してます。
個人的な意見としては「簡単ログインつけない」のは現状のユーザーリテラシーでは逆に危険ではないかと思います。
なので、「簡単ログイン危ない!」→「こうすればOKじゃん!」って方向にいって欲しいという事でこんなの書いてみました。
で最後に僕だとどんな感じでやってるか置いておきます。
最初にIPアドレスからキャリアを判定してキャリア毎に情報を取得する。
高木さんのあげられてる脆弱性の例と違うのはその点位です。
なお、IP判定の部分には高速という下記のプログラムをいつも利用させて貰ってます。
PHPで高速に携帯ゲートウェイのIPから携帯キャリアを判別する – グニャラくんのグニャグニャ備忘録@はてな
class getMobileData
{
public function get()
{
//キャリア判定はIPアドレスで判定
$carrier = $this->ip2mobile( $_SERVER['REMOTE_ADDR'] );
$serial = '';
//個体識別番号はキャリア毎に取得
//softbankのIPからdocomoの個体識別情報送信されてもスルーって事です
switch( $carrier )
{
case 'docomo':
$serial = $_SERVER['HTTP_X_DCMGUID'];
break;
case 'softbank':
$serial = $_SERVER['HTTP_X_JPHONE_UID'];
break;
case 'au':
$serial =$_SERVER['HTTP_X_UP_SUBNO'];
break;
}
return $serial;
}
//http://d.hatena.ne.jp/tasukuchan/20071231/1199105717のip2mobileをつけて終わり
(´・ω・`)…使ってていい?
Yiiを紹介とかしてるスライドの紹介 | Yii Framework触るぜ日記(13.5)
4月 26th
なんとなく、yii を紹介してるスライドをいくつかまとめてみる。
スライドでの紹介とか見ると「へぇ~。やってみよっかな」ってなるよね。
なるよね?
Yii Introduction
英語ですが。
ソースコードが少し多めなんで理解を深めるのにどうぞ。
XOOPSのモジュールをYiiで開発
すげぇw
ってか日本語のスライド3つしか見つけられなかった(´・ω・`)
増えてったら逐次たす!多分。
guiのcrudツール”gii” | Yii Framework触るぜ日記(13)
4月 24th
giiはyiiのスキャフォールディングをweb画面上で行おうというもの。
イチイチ、sshで入ってゴニョゴニョしなくてもいい!
各フォームでフィールドにフォーカスするとそれに応じた説明も表示されるし、phpMyAdminでテーブルさわってmodel作り直しなどもweb上からだと気軽に出来ますよね!
ただこのgii、実はまだ正式実装はされていません。
Yii PHP framework 1.1.2からの実装予定らしいです。
今使うにはsvnで最新のtrunkをcheckoutしないとダメです。
えぇ、ガッツリ人柱ですね。
素直に1.1.2をワクテカしておきましょう(・∀・)
あと誰か日本語に翻訳してくれるとハッピーですよね。
エキサイト翻訳との往復は疲れる…
Widget試してみる Yii Framework触るぜ日記(12)
4月 18th
widgetって、何て読むのが正解なんでしょうね?
ゥィジェット?ガジェット?
そういえば、widthはウィドゥスでheightはハイト(ヘイト)・・・ですよね?
さらにさらにaタグのhrefはエイチレフでimgのsrcはエスアールシー。です・・・よね?
さて、今回はwidgetを試してみるテストです。
よくあるviewの共通部分を管理しようというものですよね。
正直、公式サイトにある日本語のポートレットについてのページがエラーになっててよくわかんないですけど。
とりいそぎ書き留めます。
エクステンション使ってみた Yii Framework触るぜ日記(11)
4月 3rd
Yiiにだって便利なエクステンションはあるんだい!
ってコトでいくつか使ってみました。
yii-userエクステンション
これは前に書いたや。
終わり。
ktaiエクステンション
ktai
微妙に使ってます。
というのも、自分で書いた携帯用viewファイル読み込み使いたかったし、SoftBankでのUTF8化に対応してなかったので。。
※SoftBank機だと書き込みフォームをUTF8にしないと絵文字送ってくれない機種などあります。
とか書いたけど携帯用サイトを構築するのに便利な機能が一通り揃ってますよ!
docomo向けにcssをインライン化してくれたり、絵文字に対応、携帯用viewファイルなど。
ただ、一個バグがあって連続した絵文字の表示が出来なかったです。
とはいえ一箇所修正するだけっぽいので自分で直しちゃいましょう。
filters.ktai.Emoji.phpの150行目あたりです。
static public function convert($str)
{
// $regexp = '/\[([ies]:[0-9]{1,3})\]/';
$regexp = '/\[([ies\*]):([\x21-\x7E]+)\]/';
return preg_replace_callback($regexp, array('Emoji', 'convert_callback'), $str);
}
これを下記のように。
static public function convert($str)
{
// $regexp = '/\[([ies]:[0-9]{1,3})\]/';
$regexp = '/\[([ies\*]):([\x21-\x7E]{1,3})\]/';
return preg_replace_callback($regexp, array('Emoji', 'convert_callback'), $str);
}
えぇ。
見て分かるようにアップデートされた際に量指定演算子付け忘れられたダケみたいです。
これで連続した絵文字も無問題になります。
firephp-logrouteエクステンション
firephp-logroute
ログ出力をFirePHPに対応したヘッダーで出すエクステンションです。
いや、別にCWebLogRouteでいいじゃん!って話もあるけど。
上記の携帯エクステンションと一緒に使うとログ部分がSJIS化されずに化けたりしますしね。
使い方はコチラでCoreファイルをDLしてvendorsに保存。
firephp-logrouteエクステンションもDLして保存。
あとはconfig/main.phpのlogの設定をかえるだけです。
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class' => 'ext.shiki.firePHPLogRoute.ShikiFirePHPLogRoute', // "ext" alias points to /protected/extensions
'fbPath' => 'application.vendors.FirePHPCore031.lib.FirePHPCore.fb', // set path to fb.php
),
),
),
これで画面は綺麗なまま、FireBugでログをチェック出来ます。
ヨカッタ(・∀・)
active-data-provider-with-scopesエクステンション
active-data-provider-with-scopes
これ。
前回のNameScopeの時には書かなかったけど、CDataProvidorでNameScopeが使えないという弱点を克服するものです!
まぁムチャすれば出来ないコトもなかったんですが、このエクステンションを使えばより直感的になります。
使い方は…DLしてcompornentsディレクトリにでも放り込んで下さい。
したら、ControllerでCをEに変更するだけです。
例えばCRUDしたIndexアクションの場合は下記のような感じだと思います。
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Post');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
これのCActiveDataProviderをEActiveDataProviderに変更するだけ。
これでNameScopeを使う準備はOKです。
雰囲気としては
$dataProvider=new EActiveDataProvider('Profile',array(
'criteria'=>array(
'scope'=>array('published'),
),
) );
やっほーい!
便利なNameScopeが更に便利に使えちゃいます!
おまけ:ムリにCActiveDataProviderにsocpeを使うネタ。
$dataProvider=new CActiveDataProvider('Profile',array(
'criteria'=>Post::model()->published()->getDbCriteria(),
) );
何か気持ち悪いよね!
Name Scopeってしゅごいねー Yii Framework触るぜ日記(10)
3月 30th
「しゅごいねー」は不朽の名作『赤ちゃんと僕』のミノル君からパクりました。
YiiにはName Scopeという便利機能があります。
cakeとかSymfonyにもあるのかな?Railsからパクったらしいです。
例えば
class model
{
public function scopes()
{
return array(
'scope1'=>array(
'condition'=>'status=:status',
'params'=>array(':status'=>'public',
'order'=>'created',
),
'scope2'=>array(
'limit'=>10,
),
);
}
こんな感じで設定しておけば、
$models = $model->scope1()->scope2()->findAll();
上記みたく書いたらscope1の条件とかscope2のlimitが反映されて検索してくれる。
さらに、リレーション時にも使えて
$model->scope1->with('comment:scope3')->findAll();
こんな感じでリレーションcommentで使うmodelにscope3が設定されてると、それが反映されて以下略、みたいな。
このName Scopeの素晴らしさはそれだけではなく、引数も扱えるんですよ。
class model{
function scopeHoge( $category ){
$this->getDbCriteria()->mergeWith(array(
'condition'=>'category='.$category,
));
return $this;
}
これで下記のように書けばcateogryが3のモノを取ってくる。
$model->scopeHoge(3)->findAll();
便利ですよね。
思わずRails先生の方向いて手をあわせました。
でも一個だけ弱点があって。。。
引数を取れる関数バージョン時とリーレションでの適用を同時に使えないんですよ。
$model->scope1()->with('comment:scopeHoge(3)')->findAll();
いや、引数取れないんだしいいじゃん!って話もあるんですけどね。
リレーションで使うName Scopeは素直にscopes関数で設定してあげましょう。
出来れば命名規則(プリフィックスでscopeとか)でもいいから関数対応してほしいナ。
あと、注意点としてwith()の返り値はmodel(CActiveRecode)じゃなくてCActiveFinderという別モノなので、with()からNameScopeにはチェイン出来ません。
かならず『モデル->スコープ->with->find』という流れにするように気を付けましょう(・∀・)コレで10分ハマッタ!
ヨッパゲついでに小話2 Yii Framework触るぜ日記(9)
3月 25th
ビール数杯と焼酎数杯でペロンペロンです。
こんなだと女の子に嫌われるゾ!
だからって酒飲まないのは負けみたいだし強くなろうね(・∀・)
さて、酔いついでに最近貯めていたYii PHP frameworkの小話を保存する。
Model名
Model名はYiiの公式サイトでは頭文字を大文字にする事を推奨ます。
と、あるんですがコレ、推奨じゃなくて必須(?)です。
便利なリレーションのwith()で入れ子にした際に一文字目を大文字で探されます。
$posts=Post::model()->with(
'author.profile',
'author.posts',
'categories')->findAll();
こんな感じでやった際に、author.profileのprofileなんかはProfile.phpで探されます。
(この例だとpostsもPosts.phpで探します)
ワイ、途中で全部大文字にしたがな!
Yii-userエクステンション
Yii-userエクステンション便利そうなんで使ってみました。
その際の注意点を。
まず・・・action名を省略して引数を持ったURLでアクセスするとurlManagerの設定(?)によってはエラーになります。
恐らくpathに設定してたせいですが…。
考えるのも面倒だったので下記の2箇所を修正しました。
これは新規登録時とパスワード忘れた時用のメールに記載されるURLです。
RegistrationController.phpの48行目の’/user/activation’を’/user/activation/activation’に。
RecoveryControllerも変更(確か・・・コレ・・・だったよーな・・・)。
あと、typoとか翻訳ファイル(元にはないけど/messages/jのファイル)に抜けがあるんで気をつけた方がいいです。
modules/user/models/RegistrationForm.php
こちらに、「users’s」ってのがありますが、これはtypoで正解は「user’s」のハズです(翻訳ファイルもそーなってる)。
あとは翻訳ファイルに
‘Manage Profile Field’を追加
‘This users\’s email adress already exists.’を追加
‘Update’を追加
これで使える気がします。
他にもあれば教えて下さい!
俺使ってるんで!
その他
あった気がしたけど・・・アタマが回らないので。
えー、今(2010/03/25)にYii PHP Framework試すならバージョン1.1.0がオススメです。
1.1.1だとbeforeFindがマトモに動かないのでちょっと厳しいかなと思います。
1.1.2で修正予定らしいのでそれが出たらそれで。
そんな感じです。
こーゆー感じなのでグダグダな感じなのでYii Framework触るぜ日記はいつ終わるかわかりません。
だけど、これだけ書いたら今度こそリセットしたくないなーとは思いました!
いつかYiiの情報が日本語で溢れる日を夢見て、今日もあと2,3杯呑んで寝るとします(・∀・)
アクション毎にCSSとかJavaScriptを使う Yii Framework触るぜ日記(8)
3月 25th
愚痴っただけでも何なので。
このページではhoge.cssを使いたい!
とかfoo.jsを読み込みたい!
ってのがあるんですよ。
ね。
そんなときの解決方法。
protected/view/layouts/main.phpを見てみると、な~んも書いてない。
「オレ、ここで指定されたCSSとかJavaScriptはくよ!」
そんな雰囲気がまったくない。
・・・あれ~っと思いつつAPIを見てるとそれらしきもの発見。
CClientScriptがそれです。
CWebApplicationのAPIに【clientScript: manages client scripts (javascripts and CSS).】
と書かれている。
CSSって書かれるし・・・。
ダメ元で試したら、やり方は簡単でした(さすがYii!)。
Controllerの当該actionで下記のように書くだけ。
Yii::app()->getClientScript()->registerCssFile( '/css/hoge.css' );
これで書いたactionの時のみ/css/hoge.cssを読み込みます!
CClientScriptのAPIを見れば他にどんな事ができるか一目瞭然です。
layouts/main.phpには何ら特別な記述されてないのにっ! 不思議!!
ソースを読もうかと思ったけどお酒が回ってるので諦めました。
まとめ
今日のお寿司は美味しかったです(・∀・)ひゃっほーい!
あれ? Yii Framework触るぜ日記(7.5)
3月 24th
日記というかただの愚痴なんで7.5です。
もしくはbug reportingですかね(・∀・)
CActiveRecode.phpのquery()のトコが気になる。
Yii PHP framework 1.1.0
private function query($criteria,$all=false)
{
$this->beforeFind();
$this->applyScopes($criteria);
$command=$this->getCommandBuilder()->createFindCommand($this->getTableSchema(),$criteria);
return $all ? $this->populateRecords($command->queryAll()) : $this->populateRecord($command->queryRow());
}
だったのが
Yii PHP framework 1.1.1
では
private function query($criteria,$all=false)
{
$this->applyScopes($criteria);
if(empty($criteria->with))
{
if(!$all)
$criteria->limit=1;
$this->beforeFind();
$command=$this->getCommandBuilder()->createFindCommand($this->getTableSchema(),$criteria);
return $all ? $this->populateRecords($command->queryAll()) : $this->populateRecord($command->queryRow());
}
else
return $this->with($criteria->with)->query($criteria,$all);
}
何か色々機能が増えてそうだね♪ って話じゃない。
$this->applyScopes($criteria)を呼ぶタイミングが変わってるんですよ。
$this->beforeFind()の前と後に。
でapplyScopes()は何と言うか、CDbCriteria(よーするにSQLクエリー)の情報を混ぜる役目っぽいのですよ。
新しいバージョン(1.1.1)ではbeforeFind()の前に呼ばれている。
これだと…そう、beforeFind()で条件を指定出来なくない!?
って話。
Yii Framework触るぜ日記(4)でやったshimiSoftDeleteが動いてなくて「あれ?俺、試してなかったっけ?」となっていたんですが…バグじゃね?
念の為にyii-1.1.0で試したらちゃんと動くじゃねーか!
仕様変更とも言えるかもしれないけど…検索条件さわれないbeforeFindに何の意味があるんですか(ノд`)俺の数時間返せ…
Yii PHP framework 1.1.2で修正される事を切に願います。
ってか誰か英語出来る人、本家に聞いてみてほしい(´・ω・`)
追記:速攻
issue見たらあった。。。orz
えー…なんなろこのキモチ(´・ω・`)
追記:one more thing!
えーっと、1.1.2が出るまで自力で修正する人は
CActiveRecode::query()の位置を変えるのと、CActiveFinder::query()の方も変更しないとwith()使った際にアレです。
これでさらに30分は使った。。。

