2012-12-28 53 views
12

这是通过POST发送数组的最安全的方式吗?PHP,通过POST传递数组

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

,或者使用implode()以创建单个变量,传递变量,然后使用explode()找回值到一个新的数组?

+0

如果您在客户端和服务器之间来回发送结构化数据,为什么不将其序列化为JSON? – 2012-12-28 15:14:35

+1

对于通过POST传递数组,您认为内在不安全?这只是数据。 –

+1

我通常喜欢'json_encode()'的东西。然后用选项true将json_decode()返回。 – phpisuber01

回答

6

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

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

这一切都取决于你真的想做的事情。

+1

会话和发布数据是应该用于不同数据的两个完全不同的东西。说*只是将数组保存到会话变量*忽略它们之间的差异。这可能是对的,也可能是错误的。从提供的问题,我们根本无法分辨... – ircmaxell

+0

我只是在推测。生病编辑我对此的回答 – Neal

+0

我也这样认为,但是如果我忘记清除$ _SESSION变量,或者如果发生阻止它的事情,那将会是个问题 – user1722791

19

编辑如果你问有关安全,请参阅我编在底部编辑

PHP已经提供了这一特定目的的serialize功能。将它传递给一个数组,它会给你一个字符串表示。当你想把它转换回数组时,你只需使用unserialize函数。

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

这经常被懒惰的编码器用来将数据保存到数据库。不推荐,但作为快速/肮脏的解决方案。

附录

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

12

你可以把它放在会议:

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个字符左右。

我会尽可能使用会话。

+2

SESSION比在输入类型中存储数据更安全,因此SESSION是服务器端,因此用户无法更改它。同意你@laxonline –

+0

我有一个问题在这里。如果表单中有成千上万的输入,那么同样的事情会发挥作用吗? – anujeet

5

有两件事需要考虑:用户可以修改表单,并且您需要保护跨站点脚本(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(),以确保您的输入。这将字符编码为&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.php../db-connect.php)。

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

+0

这只会在表单上工作吗? – user1722791

+0

'htmlspecialchars()'应该应用于所有用户输入。 StackOverflow可能会做类似于您的用户名的操作:它在任何地方写入,所以它不能是恶意HTML。用户可以修改他们正在查看的任何HTML。我这样做是为了在Google奥运游戏中获得高分:https://sphotos-b.xx.fbcdn.net/hphotos-ash4/418275_485985401412972_1427008375_n.jpg表单很特殊,因为它们包含用户发回的输入服务器。你需要检查他们发送给你的每个输入信息,以确保它是有道理的,否则人们会攻击你的网站。 – Chris

+0

谢谢,我会尽量始终牢记这一点。 – user1722791

6

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

name标签可以作为数组使用。