这是通过POST
发送数组的最安全的方式吗?PHP,通过POST传递数组
foreach ($id as $array)
{
<input type="hidden" name="prova[]" value="<?php echo $array; ?>"/>
}
<input type="submit" name="submit"/>
,或者使用implode()
以创建单个变量,传递变量,然后使用explode()
找回值到一个新的数组?
这是通过POST
发送数组的最安全的方式吗?PHP,通过POST传递数组
foreach ($id as $array)
{
<input type="hidden" name="prova[]" value="<?php echo $array; ?>"/>
}
<input type="submit" name="submit"/>
,或者使用implode()
以创建单个变量,传递变量,然后使用explode()
找回值到一个新的数组?
如果您已经在服务器(PHP)端拥有它,为什么要通过帖子发送它?
为什么不直接将数组保存到变量中,以便您可以在提交表单时使用它,这可能会使其更“安全”,因为客户端无法通过编辑源更改变量。
这一切都取决于你真的想做的事情。
会话和发布数据是应该用于不同数据的两个完全不同的东西。说*只是将数组保存到会话变量*忽略它们之间的差异。这可能是对的,也可能是错误的。从提供的问题,我们根本无法分辨... – ircmaxell
我只是在推测。生病编辑我对此的回答 – Neal
我也这样认为,但是如果我忘记清除$ _SESSION变量,或者如果发生阻止它的事情,那将会是个问题 – user1722791
编辑如果你问有关安全,请参阅我编在底部编辑
PHP已经提供了这一特定目的的serialize功能。将它传递给一个数组,它会给你一个字符串表示。当你想把它转换回数组时,你只需使用unserialize函数。
$data = array('one'=>1, 'two'=>2, 'three'=>33);
$dataString = serialize($data);
//send elsewhere
$data = unserialize($dataString);
这经常被懒惰的编码器用来将数据保存到数据库。不推荐,但作为快速/肮脏的解决方案。
附录
我是你正在寻找一种方式来可靠地发送数据,而不是“安全”的印象。无论你如何传递数据,如果它正在通过用户系统,你根本无法相信它。通常,您应该将其存储在服务器&的某个位置,使用凭证(cookie,会话,密码等)查找它。
你可以把它放在会议:
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个字符左右。
我会尽可能使用会话。
SESSION比在输入类型中存储数据更安全,因此SESSION是服务器端,因此用户无法更改它。同意你@laxonline –
我有一个问题在这里。如果表单中有成千上万的输入,那么同样的事情会发挥作用吗? – anujeet
有两件事需要考虑:用户可以修改表单,并且您需要保护跨站点脚本(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(数字)是安全的,因为您可以检查数字是否存在,然后从数据库中提取文件名(假定您的数据库包含经过验证的输入)。 A文件由于上述原因,名称不安全。您必须重新验证文件名,否则我可以将其更改为任何内容。
这只会在表单上工作吗? – user1722791
'htmlspecialchars()'应该应用于所有用户输入。 StackOverflow可能会做类似于您的用户名的操作:它在任何地方写入,所以它不能是恶意HTML。用户可以修改他们正在查看的任何HTML。我这样做是为了在Google奥运游戏中获得高分:https://sphotos-b.xx.fbcdn.net/hphotos-ash4/418275_485985401412972_1427008375_n.jpg表单很特殊,因为它们包含用户发回的输入服务器。你需要检查他们发送给你的每个输入信息,以确保它是有道理的,否则人们会攻击你的网站。 – Chris
谢谢,我会尽量始终牢记这一点。 – user1722791
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标签可以作为数组使用。
如果您在客户端和服务器之间来回发送结构化数据,为什么不将其序列化为JSON? – 2012-12-28 15:14:35
对于通过POST传递数组,您认为内在不安全?这只是数据。 –
我通常喜欢'json_encode()'的东西。然后用选项true将json_decode()返回。 – phpisuber01