2010-04-26 7 views
8

Ho riscontrato una situazione in cui è necessario passare le variabili $ _SESSION da un dominio a una pagina iFrame da un altro dominio. Ho passato gli ultimi 16 giorni a provare vari metodi inutilmente. Penso che l'unico modo logico sarebbe quello di codificare le variabili nell'URL che chiama l'iFrame e decodificarle nella pagina iFrame. Non sono sicuro di come andare su questo e sto cercando eventuali campioni, assistenza ecc. Che posso trovare.Come passare le variabili di sessione da un dominio a un altro in PHP

Grazie per tutti e tutti i suggerimenti.

Ecco un esempio di quello che sto cercando di fare ...

Esempio:

<!-- 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"> 

Quindi da qui sto colpendo l'iframe_test.php e procedendo come segue: Codice PHP: function StripSpecChar ($ val) { return (preg_replace ('/ [^ a-zA-Z0-9 "" -. @:/_] /', '', $ Val)); }

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

e ottengo un array di sessione che assomiglia a questo: Codice:

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

ancora tutto bene finora .... chiamare l'iFrame

Codice:

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

Quindi COME prendo ...

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

e trasformarlo nell'URL codificato che sto cercando? Inoltre, una volta che è fatto come ottengo la sessione vars indietro come sessione vars in quella nuova pagina del dominio iFrame ...

+1

Perché pensi che è necessario inviare esattamente variabile di sessione? perché non usare qualche altro metodo? Quali sono questi domini? Quale di questi controlli? condividono lo stesso server? –

risposta

0

si può prendere una matrice assoicative e convertirlo in una stringa di query con la funzione http_build_query

Nota: il secondo array che hai postato non è l'output corretto di un array di sessione.

Nella pagina/dominio di ricezione, basta prendere la stringa di query e posizionare/disinfettare i parametri attesi nel proprio array $ _SESSION (o qualsiasi altra cosa si debba fare).

Questo è più sicuro dell'utilizzo di qualcosa come serialize/unserialize poiché vengono utilizzati solo gli array.

2

serializzare la matrice sessiondata e inviarlo come parametro e quindi deserializzare esso http://www.php.net/manual/en/function.serialize.php

+3

l'uomo è semplicemente terribile –

+0

Ha chiesto dei modi per farlo e sembrava un po 'disperato, ho dato il mio contributo sull'argomento e lo lascio fare. Se è buona pratica o meno dipende da lui. –

1

Uso serialize() e poi base64_encode() passare i dati senza danneggiare e (soprattutto) mantenendo la struttura.

Non è una buona pratica, perché quindi chiunque calcoli come funziona può iniettare dati arbitrari, ma se è quello che vuoi fare, funzionerà.

+0

@Col. Shrapnel Sto rispondendo come qualcosa può essere fatto, e poi fornendo l'avvertimento e il ragionamento sul perché non dovrebbe essere fatto. Non mentirò e dirò che non ho mai usato un metodo simile in passato. : D Tutti devono commettere errori per imparare. –

+0

Vale anche la pena notare che non ci sono cattivi modi in cui ci sono solo cattive implementazioni .. oh il codice heracy che ho scritto ai miei tempi, ma che ha funzionato perfettamente per quello che è stato intenzione di fare. –

1

Perché non basta inviare l'id di sessione al dominio otehr (e supponendo che possano leggere lo stesso substrato di archiviazione di sessione) utilizzare quello come id di sessione lì, ad es.

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

Non testato - puoi forzare il valore in $ _COOKIE [session_name()] prima di chiamare session_start() – symcbean