2010-04-26 1 views
8

Я столкнулся с ситуацией, когда мне нужно передать переменные $ _SESSION из одного домена на страницу iFrame из другого домена. Я провел последние 16 дней, пытаясь использовать разные методы. Я думаю, что единственным логическим способом было бы кодирование переменных в URL-адресе, который вызывает iFrame и декодирует их на странице 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 
) 

Тем не менее все хорошо до сих пор .... называют плавающего фрейма

Код:

<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']; 

и превратить его в кодированный URL-адрес, который я ищу? Кроме того, как только это будет сделано, как я сессия вары назад, как сессия вары на этой новой доменной IFrame странице ...

+1

Почему вы думаете, что вам нужно отправить именно переменную сеанса? почему бы не использовать какой-либо другой метод? Что такое эти домены? Какие из них вы контролируете? они используют один и тот же сервер? –

ответ

0

Вы можете взять assoicative массив и преобразовать его в строку запроса с помощью функции http_build_query

Примечание: второй размещенный вами массив не является правильным результатом массива сеансов.

На принимающей странице/домене просто введите строку запроса и поместите/дезинфицируйте параметры в ваш массив $ _SESSION (или что вам нужно сделать с ним).

Это безопаснее, чем использовать что-то вроде serialize/unserialize, поскольку используются только массивы.

2

сериализовать sessiondata массив и отправить его в качестве параметра, а затем десериализации его http://www.php.net/manual/en/function.serialize.php

+3

Человек, который просто ужасен –

+0

Он попросил способы сделать это и казался отчаянным, я дал свой вклад в эту тему и оставил это на этом. Если это хорошая практика или нет, он зависит от него. –

1

Использование serialize(), а затем base64_encode() передавать данные без развращает его и (в основном) сохраняет свою структуру.

Это не очень хорошая практика, потому что тогда любой, кто выясняет, как это работает, может вводить произвольные данные, но если это то, что вы хотите сделать, это сработает.

+0

@Col. Шрапнель Я отвечаю, как что-то можно сделать, а затем предостерегая и аргументируя, почему это не должно быть сделано. Я не буду лгать и говорить, что я раньше не использовал подобный метод. : D Каждый должен делать ошибки, чтобы учиться. –

+0

Также стоит отметить, что нет никаких плохих путей, есть только плохие реализации. О, код, который я написал в мои дни, но все же безупречно работал над тем, что он хотел сделать. –

1

Почему бы просто не отправить идентификатор сеанса в домен otehr (и, предположив, что они могут читать одну и ту же субстанцию ​​хранения сеанса), использовать это как идентификатор сеанса, например.

<?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

Не проверено это - вы можете заставить значение в $ _COOKIE [session_name()] перед вызовом session_start() – symcbean