PHPで携帯サイトを作っています。


認証が必要なサイトなのでセッションIDを下記のように手動で持ちまわしているのですが
例)<a href="<?php echo "index.php?".session_name()."=".session_id();?>">次のページ</a>

DoComoの端末の端末固有IDを取得しようとしてaタグにutnをつけると次のページへセッションIDがわたらなくなるようで、次のページにてセッションの値が取れなくなります。
例)<a href="<?php echo "index.php?".session_name()."=".session_id();?>" utn>次のページ</a>

解決策があれば教えていただけますでしょうか。

回答の条件
  • 1人2回まで
  • 登録:2007/12/04 08:25:48
  • 終了:2007/12/11 08:30:04

回答(3件)

id:peb4peb4 No.1

peb4peb4回答回数54ベストアンサー獲得回数02007/12/04 18:09:29

ポイント16pt

HPを5分見るだけで毎月22万円貰えます

食品会社のホームページを1日5分、都合の良い時間に見るだけで、毎月22万円もらえます。

下記サイトに、不定期ですが、お申し込み方法を記載します。

この報酬は18ヵ月で一旦終わりますので、退会会員が、発生のたびに新規会員を募集します。

おおよそですが、1日平均2~6人が、先着順で新規会員になれます。

下記サイトをお気に入りに登録いただき、こまめにチェックしてみてください。

これまでの履歴を見ると、PM8~AM2時の間に新規募集が掲載されるようです。

http://blog.livedoor.jp/fffooofff/

id:toyoshi

やめてくれー!

2007/12/04 19:51:37
id:KeyKey No.2

KeyKey回答回数29ベストアンサー獲得回数42007/12/04 23:26:21

ポイント32pt

link:

session_name('sesstest');
session_start();
$_SESSION['a'] = 1234;
echo "<a href=\"index.php?". session_name() ."=". session_id() ."\"utn>test</a>";

index:

session_name('sesstest');
session_id($_GET['sesstest']);
session_start();
echo $_SESSION['a'];
echo $_SERVER['USER_AGENT'];

としたところ問題なくセッションも端末番号も取得できました。

<a href="<?php echo "index.php?".session_name()."=".session_id();?>" utn>次のページ</a>

session_id()の後ろにセミコロンがついているのが原因だと思います。

id:toyoshi

んー関係ないようです

CakePHPを使っているのですがそのあたりの問題でしょうか

2007/12/05 01:45:51
id:KeyKey No.3

KeyKey回答回数29ベストアンサー獲得回数42007/12/05 21:19:11

ポイント32pt

CakePHPだったんですか、私も現在勉強中だったりします。

携帯サイトのセッションについてはCakePHPフォーラムで話題になっていました。

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=751&forum...


またCakePHPガイドブックにも、携帯向けシステムについて10ページほど記述があります。

それによれば

/app/config/core.php


これがセッション名のようです。

※セッションIDはアクセス毎に変わります。


PHP5.2 CakePHP1.1.18にて動作確認できました。

id:toyoshi

回答有難うございます。

utnをつけたとき以外は正常な動作なので困っています・・・

HTTPのヘッダをみてもきちんとセッションIDが付いたアドレスで着ているんですけどね。。

2007/12/06 01:08:50
  • id:KeyKey
    最後のセミコロンうんぬんは関係なかったですね^^;
  • id:KeyKey
    上で書いてあるとおりこちらでは動作確認できていますが端末ID取得できたでしょうか?
    一応ソースを晒しておきます。
    posts_controller.php

    class PostsController extends AppController {
     var $name = 'Posts';
     function index() {
      $_SESSION['abc'] = 1111;
     }
     function test() {
      $_SESSION['abc'] = 2222;
     }
    }

    posts/index.thtml
    <?php
     echo $_SESSION['abc']
    ?>
    <a href="/posts/test?<?php echo h(CAKE_SESSION_COOKIE); ?>=<?php echo h(session_id()); ?>" utn>link</a>
    <?php
     echo $_SERVER['HTTP_USER_AGENT'];
    ?>

    posts/test.thtml
    <?php
     echo $_SESSION['abc']
    ?>
    <a href="/posts/index?<?php echo h(CAKE_SESSION_COOKIE); ?>=<?php echo h(session_id()); ?>" utn>link</a>
    <?php
     echo $_SERVER['HTTP_USER_AGENT'];
    ?>
  • id:toyoshi
    フォロー有難うございます。
    調査したところuid(端末ID)は取得できているのですが
    DoCoMoではUSER_AGENTが書き換えられるため、セッション管理の部分でセッションハイジャックと判定されていることがわかりました。
    ですので、セッションのコンポーネントをapp以下にコピーして、チェックのメソッドをオーバーライドしてやれば直るのかなと思います。
    また修正できたら報告させて頂きたいと思います。

  • id:toyoshi
    解決しましたので報告させていただきます。
    認証のコンポーネントにて$this->Session->valid()として、valid()という
    前回のセッションの作成日時とユーザーエージェントを使ったセッションの正当性を確かめるメソッドを実行していました。
    DoCoMoの場合はutnをつけて端末情報を取得しようとするとユーザーエージェントが変わる(端末IDが付与される)ため
    認証の段階で、「直前のアクセスとユーザーエージェントが変わっているので不正」として弾かれていました。

    参考になるソースまで晒してくださったid:KeyKeyさん有難うございました。
    おかげで問題の切り分けができ、解決に役立ちました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません