2010-04-26 92 views
8

我遇到了需要將$ _SESSION變量從一個域傳遞到另一個域的iFrame頁面的情況。我花了16天時間嘗試各種方法無濟於事。我認爲唯一合乎邏輯的方法是將變量編碼到調用iFrame的url中,並在iFrame頁面中解碼它們。我不知道如何去做這件事,我正在尋找我能找到的任何樣品,援助等。如何在PHP中將會話變量從一個域傳遞到另一個域

感謝您的任何和所有的建議。

這裏是什麼,我試圖做一個例子...

例子:

<!-- Note only using hidden as I didn't want to build the form at test phase--> 
<form name="test" method="post" action="iframe_test.php"> 
<input type="submit" name="Submit" /> 
<input type="hidden" name="fName" value="abc" /> 
<input type="hidden" name="lName" value="def" /> 
<input type="hidden" name="address1" value="ghi" /> 
<input type="hidden" name="address2" value="jkl" /> 
<input type="hidden" name="country" value="mno" /> 
<input type="hidden" name="postal_code" value="pqr" /> 
<input type="hidden" name="city" value="stu" /> 
<input type="hidden" name="retUrl" value="vwx"> 
<input type="hidden" name="decUrl" value="yz"> 
從這裏我打了iframe_test.php和做以下

所以: PHP代碼: 函數StripSpecChar($ val){ return(preg_replace('/ [^ a-zA-Z0-9「」 - 。@:/ _] /','',$ val)); }

foreach ($_POST as $key => $val) { 
$_SESSION[$key] = StripSpecChar($val); 
} 

,我得到一個會話陣列看起來像這樣: 代碼:

Array 
(
    [fName] => abc 
    [lName] => def 
    [address1] => ghi 
    [address2] => jkl 
    [country] => mno 
    [postal_code] => pqr 
    [city] => stu 
    [retUrl] => vwx 
    [decUrl] => yz 
) 

不過都好到目前爲止....調用的iFrame

代碼:

<body> 
Some page stuff here 

<div align="center"><span class="style1"><strong>This is the iFrame Page</strong></span> 
</div> 
<div align="center"> 
<iframe src="https://www.other_domain.org/iframe/reserve.php" width="500" height="350" frameBorder="0"></iframe> 
</div> 

</body> 

那麼我該如何...

$_SESSION['fName']['abc']; 
$_SESSION['lName']['def']; 
$_SESSION['address1']['ghi']; 
$_SESSION['address2']['jkl']; 
$_SESSION['country']['mno']; 
$_SESSION['postal_code']['pqr']; 
$_SESSION['city']['stu']; 
$_SESSION['retUrl']['vwx']; 
$_SESSION['decUrl']['yz']; 

並將其轉化爲我正在尋找的編碼網址?而且一旦這樣做了,我怎麼把會話瓦爾早在會話中新域的iFrame網頁瓦爾...

+1

爲什麼你認爲你需要準確地發送會話變量?爲什麼不使用其他方法?這些領域是什麼?你控制哪一個?他們共享同一臺服務器嗎? – 2010-04-26 16:43:34

回答

0

可以採取assoicative陣列,並將其與功能http_build_query

轉換成一個查詢字符串注意:您發佈的第二個數組不是會話數組的正確輸出。

在接收的頁面/域上,只需要查詢字符串,並將預期的參數放置到您的$ _SESSION數組中(或任何您需要使用的參數)。

這比使用諸如serialize/unserialize之類的東西更安全,因爲只有數組正在被使用。

2

序列化sessiondata陣列並將其作爲一個參數,然後反序列化 http://www.php.net/manual/en/function.serialize.php

+3

那個男人真是太可怕了 – 2010-04-26 16:40:50

+0

他問道如何去做,似乎有點絕望,我就這個問題提出了自己的意見,並將其留在那裏。如果是好的做法取決於他。 – 2010-04-26 16:52:05

1

使用serialize()然後base64_encode()來傳遞數據,而不會破壞它和(主要是)保持其結構。

這不是一個好的做法,因爲那麼任何人如果知道它是如何工作的,都可以注入任意數據,但如果這就是你想要做的,那麼它就會工作。

+0

@Col。彈片我正在回答如何做一些事情,然後提供警告和推理,說明爲什麼不應該這樣做。我不會說謊,並說過去我自己並沒有使用類似的方法。 :D每個人都需要爲了學習而犯錯誤。 – 2010-04-26 16:57:09

+0

另外值得一提的是,沒有什麼不好的方法只存在不好的實現。哦,我在我的日子裏編寫的heracy代碼,但它完美地工作,完全符合它的意圖。 – 2010-04-26 17:40:34

1

爲什麼不直接發送會話id到otehr域(並假設他們可以讀取同一個會話存儲基底)使用它作爲那裏的會話ID,例如,

<?php 
// catch remote session id, validate and reassociate 
if (md5($_GET['exported_sessid'], $shared_secret) == $_GET['check_hash']) { 
     // (basic CSRF check 
     session_id($_GET['exported_sessid']); 
} 
session_start(); 
.... 

C.

+0

未經測試 - 您可以在調用session_start()之前將值強制爲$ _COOKIE [session_name()], – symcbean 2010-04-26 22:36:50

相關問題