PHPでPOSTから取得したセッションIDでセッションを開始する

FlashのFileReferenceを使ったアップローダを作っていたところ

IE以外のブラウザではCookieが送信されない問題にぶち当たった。

そこで、CookieのデータをPOSTで送信してしまい、PHP側で無理矢理そのデータをsession_idとして認識できないかな?

と勘でやってみたところ、何故かうまくいってしまった。

ありがとうPHP。
$cookies = $_POST["cookie"];
$session_id = null;

foreach (mb_split(";", $cookies) as $cookie) {

$cookie = trim($cookie);

$arr = mb_split("=", $cookie); if (count($arr) != 2) continue;

if (session_name() == $arr[0]) { $session_id = trim($arr[1]); }

}

$_COOKIE[session_name()] = $session_id;

ini_set("session.gc_probability", なんか数値); ini_set("session.gc_divisor", なんか数値); ini_set("session.gc_maxlifetime", なんか数値); session_start();

これで正常にセッションが開始できた。

Flash側からはExternalInterfaceでJavascriptから

document.cookie

の値を取得して、それをPOSTしてやる。

document.cookie

の内容は、全てのCookieの値が連結された文字列なので、それをPHP側でsplit処理して解析してやり、

$_COOKIE[session_name()] = セッションID

としてやる事でPHPではクッキー内にセッションIDが入っていると認識してくれるらしい。

この

$_COOKIE[session_name()] = セッションID

が正直驚きだった。

事前にsetcookie()関数を呼び出すようなクッションページをかまさないと認識してくれないかと心配していたが、すんなりうまくいってしまった。

ちなみにFlash側のソースは以下
var _cookie = ExternalInterface.call("getCookie");	// javascriptで return document.cookie; をする関数を作成しておく

var req:URLRequest = new URLRequest(url); // req.requestHeaders.push(new URLRequestHeader("Cookie", _cookie)); // ↑これが使えれば一番良かったけど、FlashPlayerのセキュリティエラーになるので使えない

var variables:URLVariables = new URLVariables(); variables.cookie = _cookie; req.data = variables; req.method = "POST";

// アップロード fileReference.upload(req);

Flashは素晴らしいUIが作れるものの、色々と制限やら実装抜けやら多いので苦労が絶えない。

Check

コメントをどうぞ

メールアドレスが公開されることはありません。


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

管理人運営サイト
<技術情報サイト:PGBox>
PGBOX