serialize() et unserialize()

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : serialize() et unserialize()

par iclo » 25 mai 2007, 14:53

Pourquoi ne pas tout mettre en session ? non :roll: ?

par Zolmitriptan » 25 mai 2007, 11:28

Je te propose une solution un peu plus aboutie.
:love5: :love5: :love5: :love5: :love5: :love5:


MERCI !!!!! Ca marche nickel, pas de souci, pas d'erreur, pas de warning.....que du bonheur :D

Merci à tous pour votre aide !!

par titerm » 25 mai 2007, 10:43

Je te propose une solution un peu plus aboutie.
// Tu serialize
$data = serialize($edit);
// Pour gagner un peu de taille sur le poids de la page,  tu peux accessoirement compresser (c'est optionnel)
$data = gzencode($data);
// Tu encode en base64, cela t'affranchi de tout caractère spécial, il n'y aura plus qu'une suite de chiffre
$data = base64_encode($data);

<input type="text" name="serial" size="400" value="'.($data).'" />


// A l'arrivée, tu fais la meme chose dans l'ordre inverse

// Decode le base 64
$data = base64_decode($_POST ['serial']);
// Décompress (optionnelle et lié au choix fait a l'étape précédente)
$data = gzdecode($data);
$edit = unserialize($data);

par Zolmitriptan » 25 mai 2007, 10:03

Bonjour,
merci pour les conseils et les astuces sur la sécurité :wink: . Seulement, même avec htmlspecialchars(), il manque un bout à mes données....En effet, j'ai un texte complet dans mon tableau, or, dès qu'il y a un saut de ligne, on dirait que le passage dans post n'est plus possible.

Voila un peu de code pour expliquer tout ca :

Serialization, et passage par POST :
$serial = htmlspecialchars( serialize($edit) );
<input type="text" name="serial" size="400" value="'.($serial).'" />
-->J'ai mis type=text pour voir ce qu'il me met. Je vois qu'il me manque un bout de données.

Si je lui dit simplement dans la même page :
echo $serial;
Cela fonctionne, il m'affiche bien tout. De même si je fait
$unserial = unserialize($serial);
echo $unserial['monchamp'];
Cela fontionne.
C'est uniquement dans mon champs à passer par POST que cela ne s'affiche pas correctement, et donc bien sur, pareil à la récupération...

Une idée du pourquoi du comment ??

Merci d'avance

par Hubert Roksor » 24 mai 2007, 21:07

Il existe des méthodes pour mitiger les attaques possibles, le plus simple étant généralement d'accompagner systématiquement les données sérialisées d'une somme de contrôle assurant que les données n'ont pas été modifiées. Pour résumer, après avoir sérialisé les données vous ajoutez un mot de passe à la chaine et calculez un hash du résultat. Ensuite, avant de désérialiser vous recalculez la somme de contrôle (il faut pour cela ajouter le mot de passe aux données) et comparez le résultat avec le hash qui a été passé avec le données. Voici un exemple rapide qui ne demande qu'à être améliorer :
define('SERIALIZE_SALT', 'Mettez ici ce que vous voulez, peu importe la longueur');

$serialized = my_serialize($_SERVER);
var_dump(my_unserialize($serialized['str'], $serialized['hash']));

function my_serialize($data)
{
	$str = serialize($data);
	return array(
		'str'	=>	$str,
		'hash'	=>	md5(SERIALIZE_SALT . $str)
	);
}

function my_unserialize($str, $hash)
{
	if (md5(SERIALIZE_SALT . $str) == $hash)
	{
		return unserialize($str);
	}

	throw new Exception('Noooooooo');
}

par Hubert Roksor » 24 mai 2007, 20:51

htmlentities() est ton ami.
Tu veux dire htmlspecialchars() ? htmlentities() en fait un peu plus que nécessaire (ou souhaitable) donc autant éviter.

À part ça j'aimerais attirer votre attention sur les problèmes potentiels d'unserialize() vis-à-vis de la sécurité. unserialize() n'est pas destiné à être utilisé sur des données soumises par l'utilisateur. Par le passé, cette fonction a souvent recommandée à tort. Puis est arrivé PHP 5, __autoload(), __wakeup() et des tas d'effets secondaires dont on n'avait pas à se soucier avant. Je n'ai pas d'exemple précis, mais il serait possible pour un utilisateur malicieux de préparer des données "sérializées" qui créeraient un grand nombre d'objet (et donc consumer toute votre mémoire) ou encore un grand nombre de références (avec potentiellement la possibilité de crasher PHP et/ou exécuter son propre code) ou encore charger des objets via __autoload() et profiter des effets secondaires de leurs méthodes __wakeup(), etc... Donc voilà, par nature unserialize() n'est pas sécure.

par naholyr » 24 mai 2007, 19:04

htmlentities() est ton ami.

par @rthur » 24 mai 2007, 18:29

Bonjour,

Regarde ta source HTML et vérifie que tout passe correctement.

serialize() et unserialize()

par Zolmitriptan » 24 mai 2007, 17:06

Bonjour,

Je voudrais passer un tableau par la methode POST.
J'ai donc naturellement commencé par :

Code : Tout sélectionner

<input type="hidden" name="edit" value=$edit />
Et pour récupérer :

Code : Tout sélectionner

$edit = $_POST['edit']
$edit est un tableau. C'est le resultat d'une requête SELECT, passé par mysql_fetch_assoc()
Et bien evidemment, cela ne fonctionne pas.....

Après divers recherche et test, je suis parvenu à ceci :

Code : Tout sélectionner

$serial = serialize($edit); <input type="hidden" name="edit" value="'.$serial.'"/>
Et pour récupérer :

Code : Tout sélectionner

$edit = unserialize( $_POST['edit'] )
Je n'ai toujours rien....

Il est même arrivé que des affichages apparaissent dans mon formulaire, comme si la fonction serialize() affichait des données....

Alors, d'ou vient le problème ?? J'ai une mauvaise syntaxe, j'oublie quelque chose ??

Merci d'avance