通过POST
发送数组,哪种方式最安全?
foreach ($id as $array)
{
<input type="hidden" name="prova[]" value="<?php echo $array; ?>"/>
}
<input type="submit" name="submit"/>
或者使用implode()
创建一个单一的变量,传递这个变量,然后使用explode()
将值取回到一个新数组中?编辑 如果您询问有关安全性的问题,请参见我在底部附加的补充说明 编辑
PHP提供了一个serialize函数,专门用于此目的。将一个数组传递给它,它会给你一个字符串表示。当您想要将其转换回数组时,只需使用unserialize函数即可。
$data = array('one'=>1, 'two'=>2, 'three'=>33);
$dataString = serialize($data);
//send elsewhere
$data = unserialize($dataString);
这通常被懒惰的程序员用来将数据保存到数据库中。不建议使用,但作为一个快速/肮脏的解决方案是有效的。
补充说明
我以为你要找的是可靠地发送数据的方法,而不是“安全”的方法。无论你如何传递数据,如果它经过用户系统,你都不能完全信任它。通常应该将它存储在服务器上某个地方,并使用凭据(cookie、会话、密码等)来查找它。
http://php.net/manual/zh/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'),
)
?>
name标签可以作为数组使用。
你可以将它放在会话中:
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个字符。有两件事需要考虑:用户可以修改表单,您需要防范跨站脚本攻击(XSS)。
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()
来确保您的输入安全。它会将诸如 <
的字符编码为 <
。例如:
<input type="hidden" name="prova[]" value="<?php echo htmlspecialchars($array); ?>"/>
您可以在此处了解更多有关XSS的信息:https://www.owasp.org/index.php/XSS
表单修改
如果我在您的网站上,我可以使用Chrome开发者工具或Firebug来修改您页面的HTML。根据您的表单功能,这可能会被用于恶意目的。
例如,我可以添加额外的值到您的数组中,或者添加不属于该数组的值。如果这是一个文件系统管理器,则我可以添加不存在的文件或包含敏感信息的文件(例如:将myfile.jpg
替换为../index.php
或../db-connect.php
)。
简而言之,您始终需要检查输入内容以确保其合理,并且只在表单中使用安全的输入内容。文件ID(数字)是安全的,因为您可以检查该数字是否存在,然后从数据库中提取文件名(这假设您的数据库包含经过验证的输入)。文件名称不安全,原因如上所述。您必须重新验证文件名,否则我可以将其更改为任何内容。
如果您在服务器(PHP)端已经有这个数据,为什么还要通过邮件发送它?
为什么不将数组保存到 $_SESSION
变量中,以便在表单提交时使用它,这可能会使它更加“安全”,因为客户端无法通过编辑源代码来更改变量。
这完全取决于您想要做什么。
json_encode()
将对象转换为 JSON 字符串。然后再使用带有 true 选项的json_decode()
将其还原回来。 - phpisuber01