JeuWeb - Crée ton jeu par navigateur
[Javascript] Envoyer en GET (via ajax) un tableau de valeurs à PHP - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Javascript] Envoyer en GET (via ajax) un tableau de valeurs à PHP (/showthread.php?tid=7057)

Pages : 1 2


[Javascript] Envoyer en GET (via ajax) un tableau de valeurs à PHP - Ter Rowan - 22-07-2013

bonjour

j'envoie des éléments de formulaire en ajax (via jquery) à mon serveur (php)


data : { rankingId : id, filter : $("#"+id+" input").serialize() }

et je veux récupérer mon tableau via unserialize en php

jusqu'ici pas de problème... sauf que

le manuel PHP m'indique que je ne dois pas utiliser unserialize dans le cas de données utilisateurs (non fiables)

du coup, avant de réinventer la roue, qu'est ce que vous me conseillez ?

Je pensais pour ma part parser moi même la chaine filter, qui n'a guère de complexité (juste un tableau associatif finalement) mais peut être existe il un standard ?


RE: [JAVASCRIPT]envoyer en get (via ajax) un tableau de valeurs à PHP - niahoo - 22-07-2013

Pas réveillé ce matin hein Smile


RE: [JAVASCRIPT]envoyer en get (via ajax) un tableau de valeurs à PHP - Ter Rowan - 22-07-2013

(22-07-2013, 09:28 AM)niahoo a écrit : Pas réveillé ce matin hein Smile

clair Tongue


RE: [JAVASCRIPT]envoyer en get (via ajax) un tableau de valeurs à PHP - Ter Rowan - 22-07-2013

sinon, pas bien long côté php j'ai fait ça, mais ça m'intéresse toujours de savoir comment on fait "avec classe" ce genre de chose

$filter contient la chaine _GET["filter"]

$filter = explode("&",$filter);
$newFilter = array();
foreach( $filter as $f){
$s = explode("=", $f);
if (strcmp($s[1],"") ) $newFilter[$s[0] ] = $s[1];
}



RE: [JAVASCRIPT]envoyer en get (via ajax) un tableau de valeurs à PHP - Xenos - 22-07-2013

Si ta chaine $filter est vide, ou si elle ne contient que "&":
Citation :Notice: Undefined offset: 1 in D:\EasyPHP-12.1\www\t.php on line 7

Je conseillerai de la checker avant de l'utiliser, via une regex par exemple.


RE: [JAVASCRIPT]envoyer en get (via ajax) un tableau de valeurs à PHP - Ter Rowan - 22-07-2013

(22-07-2013, 12:17 PM)Xenos a écrit : Si ta chaine $filter est vide, ou si elle ne contient que "&":
Citation :Notice: Undefined offset: 1 in D:\EasyPHP-12.1\www\t.php on line 7

Je conseillerai de la checker avant de l'utiliser, via une regex par exemple.

oui je vais rajouter

a la base il n y en a pas besoin car l'html nécessaire (ie les input "filter") est généré par le module
mais effectivement si il y a "gruge" il faut que je controle


RE: [JAVASCRIPT]envoyer en get (via ajax) un tableau de valeurs à PHP - Xenos - 22-07-2013

Eyuup, toujours prendre la gruge en compte, sinon, cela revient à considérer que la vue (le HTML) sécurise le contrôleur, et là, on va dans le mur...


RE: [JAVASCRIPT]envoyer en get (via ajax) un tableau de valeurs à PHP - KyleK - 24-07-2013

Utiliser unserialize en PHP avec une donnée utilisateur n'est pas "interdit", il faut juste avoir conscience qu'en faisait unserialize($_GET['machin']) alors $_GET['machin'] peut contenir absolument n'importe quoi et quand je dis "absolument n'importe quoi", ça veut dire absolument n'importe quoi. L'utilisateur peut y mettre "£$£¤^¨ùsdklj8èdqsd#", il peut y mettre des nombres, des arrays à 40 niveaux, des objets de n'importe quel type (type SOAP, type Iterator), il peut y mettre du binaire, des caractères nulls, il peut y mettre des éléphants, du café, donc attention aux court-circuits !

Il faut donc vérifier les types de tout ce que tu veux :
Code :
if(strpos($_GET['machin'], "O:") === false)
{
  $data = unserialize($_GET['machin']);
  if(is_array($data))
  {
    // $data est bien un array
    if(isset($data['truc']))
    {
        if(is_string($data['truc']))
        {
             echo "Ce truc doit être un string !";
        }
        else
        {
             echo "Pas de string ? Ben tu sors.";
        }
    }
    else
    {
       echo "Vous avez oublié truc";
    }
  }
  else
  {
     echo "Le carton dans la poubelle jaune, le reste dans la poubelle verte, et dans "machin", uniquement des array !";
  }
}
else
{
   echo "Ah non pas d'objet.";
}



RE: [JAVASCRIPT]envoyer en get (via ajax) un tableau de valeurs à PHP - Xenos - 24-07-2013

Hmm... D'apres la doc PHP pour unserialize:
Citation : La chaîne linéarisée.

Si la variable délinéarisée est un objet, après avoir réussi à le reconstruire, PHP appellera automatiquement la méthode __wakeup si elle existe.

Je trouve donc cela très "risqué" d'utiliser serialize et unserialize AVANT de vérifier la donnée d'entrée. En effet, l'utilisateur peut alors instancier n'importe quelle classe (donc, déjà, c'est assez chaud, surtout si l'utilisateur instancie une classe "Singleton" par exemple, ou instancie une classe qui est une collection d'objets qui vont saturer la mémoire).

Exemple:
Code PHP :
<?php
class test
{
public function
__wakeup()
{
echo(
'I hacked you!');
}
}
$v = $_GET['obj'];
$u = unserialize($v);
// vérifier $u
?>

Si j'envoie, dans $get:
Code :
O:4:"test":0:{}

Alors l'objet "test" est instancié, et __wakeup() est appelée, et ce AVANT de vérifier la donnée utilisateur.
A mon avis, la bonne méthode consiste à vérifier d'abord les données utilisateurs, avant d'en faire quoi que ce soit, y compris un unserialize.

D'ailleurs, la documentation PHP va dans mon sens:

php.net a écrit :Avertissement

Ne passez pas d'entrée utilisateur non fiable à la fonction unserialize(). La délinéarisation peut résulter en une exécution de code chargé et exécuté lors de l'instanciation et l'auto-chargement d'objet, et ainsi, un utilisateur mal intentionné peut être capable d'exploiter ce comportement. Utilisez un standard d'échange sûr, comme JSON (via les fonctions json_decode() et json_encode()) si vous devez passer des données linéarisées à l'utilisateur.



RE: [Javascript] Envoyer en GET (via ajax) un tableau de valeurs à PHP - Ter Rowan - 24-07-2013

bien pour ça que, finalement, je n'unserialize pas et ai créé mon propre contrôle