web-dev-qa-db-fra.com

PHP, passez le tableau à travers POST

Quelle est la manière la plus sûre d'envoyer un tableau via POST?

foreach ($id as $array)
{
<input type="hidden" name="prova[]" value="<?php echo $array; ?>"/>
}
<input type="submit" name="submit"/>

ou en utilisant implode() pour créer une seule variable, passez la variable puis utilisez explode() pour récupérer les valeurs dans un nouveau tableau?

19
user1722791

Modifier Si vous posez des questions sur la sécurité, consultez mon addenda en bas Modifier

PHP a une fonction serialize prévue à cet effet spécifique. Passez-lui un tableau, et il vous en donnera une représentation sous forme de chaîne. Lorsque vous souhaitez le reconvertir en tableau, vous utilisez simplement la fonction nserialize .

$data = array('one'=>1, 'two'=>2, 'three'=>33);
$dataString = serialize($data);
//send elsewhere
$data = unserialize($dataString);

Ceci est souvent utilisé par les codeurs paresseux pour enregistrer des données dans une base de données. Non recommandé, mais fonctionne comme une solution rapide/sale.

Addendum

J'avais l'impression que vous cherchiez un moyen d'envoyer les données de manière fiable et non "en toute sécurité". Peu importe la façon dont vous transmettez les données, si elles transitent par le système des utilisateurs, vous ne pouvez pas du tout leur faire confiance. En règle générale, vous devez le stocker quelque part sur le serveur et utiliser un identifiant (cookie, session, mot de passe, etc.) pour le rechercher.

26
MrGlass

http://php.net/manual/en/reserved.variables.post.php

Le premier commentaire répond à cela.

<form ....>
<input name="person[0][first_name]" value="john" />
<input name="person[0][last_name]" value="smith" />
...
<input name="person[1][first_name]" value="jane" />
<input name="person[1][last_name]" value="jones" />
</form>

<?php
var_dump($_POST['person']);

array (
0 => array('first_name'=>'john','last_name'=>'smith'),
1 => array('first_name'=>'jane','last_name'=>'jones'),
)
?>

La balise de nom peut fonctionner comme un tableau.

14
seamus

Vous pouvez le mettre dans la session:

session_start();
$_SESSION['array_name'] = $array_name;

Ou si vous souhaitez l'envoyer via un formulaire, vous pouvez le sérialiser:

<input type='hidden' name='input_name' value="<?php echo htmlentities(serialize($array_name)); ?>" />

$passed_array = unserialize($_POST['input_name']);

Notez que pour travailler avec des tableaux sérialisés, vous devez utiliser POST comme méthode de transmission du formulaire, car GET a une limite de taille quelque part autour de 1024 caractères.

J'utiliserais des sessions autant que possible.

14
laxonline

Il y a deux choses à considérer: les utilisateurs peuvent modifier les formulaires et vous devez vous protéger contre le Cross Site Scripting (XSS).

[~ # ~] xss [~ # ~]

XSS, c'est quand un utilisateur entre du HTML dans son entrée. Par exemple, que se passe-t-il si un utilisateur a soumis cette valeur?:

" /><script type="text/javascript" src="http://example.com/malice.js"></script><input value="

Cela serait écrit dans votre formulaire comme suit:

<input type="hidden" name="prova[]" value="" /><script type="text/javascript" src="http://example.com/malice.js"></script><input value=""/>

La meilleure façon de se protéger contre cela est d'utiliser htmlspecialchars() pour sécuriser votre entrée. Cela code des caractères tels que < En &lt;. Par exemple:

<input type="hidden" name="prova[]" value="<?php echo htmlspecialchars($array); ?>"/>

Vous pouvez en savoir plus sur XSS ici: https://www.owasp.org/index.php/XSS

Modification du formulaire

Si j'étais sur votre site, je pourrais utiliser les outils de développement de Chrome ou Firebug pour modifier le code HTML de votre page. Selon ce que fait votre formulaire, cela pourrait être utilisé de manière malveillante.

Je pourrais, par exemple, ajouter des valeurs supplémentaires à votre tableau, ou des valeurs qui n'appartiennent pas au tableau. S'il s'agissait d'un gestionnaire de système de fichiers, je pourrais ajouter des fichiers qui n'existent pas ou des fichiers contenant des informations sensibles (par exemple: remplacer myfile.jpg Par ../index.php Ou ../db-connect.php).

En bref, vous devez toujours vérifier vos entrées plus tard pour vous assurer qu'elles ont un sens et n'utiliser que des entrées sûres dans les formulaires. Un ID de fichier (un numéro) est sûr, car vous pouvez vérifier si le numéro existe, puis extraire le nom de fichier d'une base de données (cela suppose que votre base de données contient une entrée validée). Un fichier Name n'est pas sûr, pour les raisons décrites ci-dessus. Vous devez soit revalider le nom de fichier, sinon je pourrais le changer en n'importe quoi.

6
Chris

Pourquoi l'envoyez-vous par courrier si vous l'avez déjà côté serveur (PHP)?

Pourquoi ne pas simplement enregistrer le tableau dans s $_SESSION variable afin que vous puissiez l'utiliser lorsque le formulaire est soumis, ce qui pourrait le rendre plus "sécurisé" car le client ne peut pas modifier les variables en modifiant la source.

Tout dépend de ce que vous vraiment voulez faire.

6
Neal