Objets sérialisés corrompus avec $_GET et $_POST
Un petit exemple pour le mettre en évidence :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <?php
if(!isset($_GET['sA'])){
echo 'encode...<br />';
$a = '>';
echo 'a = [ '.$a.' ]<br />';
$b = serialize($a);
echo 'b = [ '.$b.' ]<br />';
$sA = base64_encode($b);
echo 'sA = [ '.$sA.' ]<br />';
echo '<a href="test2.php?sA='.$sA.'">sA</a>';
}else{
echo 'decode...<br />';
$sA = $_GET['sA'];
echo 'sA = [ '.$sA.' ]<br />';
$b = base64_decode($sA);
echo 'b = [ '.$b.' ]<br />';
$a = unserialize($b);
echo 'a = [ '.$a.' ]<br />';
echo 'encode...<br />';
$a.=$a;
echo 'a = [ '.$a.' ]<br />';
$b = serialize($a);
echo 'b = [ '.$b.' ]<br />';
$sA = base64_encode($b);
echo 'sA = [ '.$sA.' ]<br />';
echo '<a href="test2.php?sA='.$sA.'">sA</a>';
}
?> |
Le souci ici est que l'encodage en base64 parfois comporte des symboles qui ne plaisent pas tellement aux passage par les variables $_GET et/ou $_POST.
Dans ce cas, > est sérialisé en s:1:">"; qui est encodé en czoxOiI+Ijs=.
Or, il y a un "+" dans cet encodage, et ça fout la merde.
Qu'utilisez-vous pour sérialiser vos objets proprement ?