Php 发布数组()

Php 发布数组(),php,arrays,forms,Php,Arrays,Forms,如果在我的表单中发布一个隐藏字段,如下所示: <input type="hidden" name="userArr" value="Array([0] => 13 [1] => 10 [2] => 12 [3] => 9 [4] => 14 [5] => 11)"> 你最好像这样做,但用户输入永远不可信!即使它被藏起来也不行 <input type="hidden" name="userArr" value="

如果在我的表单中发布一个隐藏字段,如下所示:

<input type="hidden" name="userArr" value="Array([0] => 13    [1] => 10    [2] => 12    [3] => 9    [4] => 14    [5] => 11)">

你最好像这样做,但用户输入永远不可信!即使它被藏起来也不行

<input type="hidden" name="userArr" value="<?= htmlentities(json_encode(array(10, 20, 30), ENT_NOQUOTES); ?>">
您使用的值将作为普通字符串处理,因此您无法轻松地将其转换回数组。有几种编码和解码的方法。下面是一些例子。你必须对它进行编码,这样引号就不会引起任何问题

json_编码/json_解码 序列化/取消序列化
如果使用[]调用输入,则可以向服务器发布一个数组,但此时会出现多个同名输入字段。例如,如果人们希望接收关于不同主题的邮件,则有5个复选框。所有这些主题都可以与[]具有相同的输入名称,因此您可以动态处理它,而不是为每个输入指定不同的名称。

您可以序列化数组,然后再取消序列化,但最好将数据存储在一个数组中

表格中的代码:

<input type="hidden" name"userArr" value="<?php echo base64_encode(serialize($userArr)); ?>" />
以解析器的形式:

<?php
$userArr = unserialize(base64_decode($_POST['userArr']));
?>

请注意,用户可以根据自己的意愿更改数据,因此您应该将数组作为任何其他用户输入来处理,否则将面临严重的安全漏洞。同样,会话也没有这个问题。

谢谢你每次当法国人试着说英语时都投-1。这是激励我的好方法。你假设html和php之间不存在任何关系。浏览器看到的html只是文本。浏览器无法区分PHP数组和文本。这样更好吗:@Francois:我想这不是说英语的原因。更重要的是,PHP手册中已经概述了这一点,而您尝试做的事情很可能无法以这种方式工作。我认为PHP手册的一部分也有您的法语版本。使用-1不是因为您的英语很好。注意:用户可以随意更改此数据,因此您可以将数组作为任何其他用户输入来处理,否则将面临严重的安全漏洞。总的来说,会话更安全!您永远不能信任用户输入。这给出了一个“如何”,但“为什么”在哪里?serialize不能保证输出HTML安全字符串。您可能应该将其传递给htmlentities。这一点很好,但base64是一个更好的选择,它还可以包含不可打印的字节。为什么base64是一个更好的选择?因为serialize可以输出任何字节,并且在ascii/utf-8中,从0x00到0x1F的前31个字符都是不可打印的,htmlentities对此没有帮助。示例:。base64只使用可打印ascii的一小部分,因此其输出不会有问题。
<input type="hidden" name"userArr" value="<?php echo base64_encode(serialize($userArr)); ?>" />
<?php
$userArr = unserialize(base64_decode($_POST['userArr']));
?>