Как передать переменные сеанса из одного домена в другой в PHP - PullRequest
8 голосов
/ 26 апреля 2010

Я столкнулся с ситуацией, когда мне нужно передать переменные $ _SESSION из одного домена на страницу iFrame из другого домена. Я провел последние 16 дней, пробуя различные методы безрезультатно. Я думаю, что единственным логическим способом было бы закодировать переменные в URL, который вызывает iFrame, и декодировать их на странице iFrame. Я не знаю, как это сделать, и я ищу образцы, помощь и т. Д., Которые я могу найти.

Спасибо за любые предложения.

Вот пример того, что я пытаюсь сделать ...

Пример:

<!-- 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-код: function 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']; 

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

Ответы [ 4 ]

2 голосов
/ 26 апреля 2010

Сериализует массив сессионных данных и отправляет его в качестве параметра, а затем десериализует его http://www.php.net/manual/en/function.serialize.php

1 голос
/ 26 апреля 2010

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

<?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();
....

С

1 голос
/ 26 апреля 2010

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

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

0 голосов
/ 26 апреля 2010

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

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

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

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

...