23

通过哪种方式发送数组最安全POST

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

implode()用于创建单个变量,传递变量,然后用于explode()将值取回新数组?

4

5 回答 5

30

编辑如果您询问安全性,请参阅底部的我的附录编辑

PHP 有一个为此特定目的提供的序列化函数。给它一个数组,它会给你一个字符串表示。当您想将其转换回数组时,只需使用unserialize函数。

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

懒惰的编码人员经常使用它来将数据保存到数据库中。不推荐,但可以作为快速/肮脏的解决方案。

附录

我的印象是您正在寻找一种可靠地而不是“安全地”发送数据的方法。无论您如何传递数据,如果它通过用户系统,您根本无法信任它。通常,您应该将其存储在服务器上的某个位置并使用凭据(cookie、会话、密码等)来查找它。

于 2012-12-28T15:20:22.810 回答
18

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

第一条评论回答了这个问题。

<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'),
)
?>

名称标签可以作为一个数组工作。

于 2015-03-23T11:07:47.697 回答
15

你可以把它放在会话中:

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

或者,如果您想通过表单发送它,您可以将其序列化:

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

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

请注意,要使用序列化数组,您需要使用 POST 作为表单的传输方法,因为 GET 的大小限制约为 1024 个字符。

我会尽可能使用会话。

于 2012-12-28T15:24:12.673 回答
8

有两件事需要考虑:用户可以修改表单,并且您需要防止跨站点脚本 (XSS)。

跨站脚本

XSS 是指用户在其输入中输入 HTML。例如,如果用户提交了这个值怎么办?:

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

这将被写入您的表单,如下所示:

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

防止这种情况的最佳方法是使用htmlspecialchars()来保护您的输入。这会将字符编码为<into &lt;。例如:

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

您可以在此处阅读有关 XSS 的更多信息:https ://www.owasp.org/index.php/XSS

表格修改

如果我在您的网站上,我可以使用 Chrome 的开发人员工具或 Firebug 来修改您页面的 HTML。根据您的表单的用途,这可能会被恶意使用。

例如,我可以将额外的值添加到您的数组中,或者添加不属于数组的值。如果这是一个文件系统管理器,那么我可以添加不存在的文件或包含敏感信息的文件(例如:替换myfile.jpg../index.phpor ../db-connect.php)。

简而言之,您总是需要稍后检查您的输入以确保它们有意义,并且只在表单中使用安全输入。文件 ID(一个数字)是安全的,因为您可以检查该数字是否存在,然后从数据库中提取文件名(这假设您的数据库包含经过验证的输入)。由于上述原因,文件名不安全。您必须重新验证文件名,否则我可以将其更改为任何内容。

于 2012-12-28T15:31:07.100 回答
6

如果您已经在服务器(PHP)端拥有它,为什么还要通过帖子发送它?

为什么不将数组保存到 s$_SESSION变量中,以便在提交表单时可以使用它,这可能会使其更加“安全”,因为那时客户端无法通过编辑源来更改变量。

这一切都取决于你真正想做什么。

于 2012-12-28T15:15:04.017 回答