Monthly Archives: 10月 2011

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が作れるものの、色々と制限やら実装抜けやら多いので苦労が絶えない。