【问题标题】:PHP, pass array through POSTPHP,通过 POST 传递数组
【发布时间】:2012-12-28 15:13:06
【问题描述】:

通过POST 发送数组最安全的方法是什么?

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

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

【问题讨论】:

  • 您认为通过 POST 传递数组本质上不安全的地方是什么?这只是数据。
  • 我通常喜欢json_encode()的东西。然后 json_decode() 使用选项 true 将其恢复。
  • 您在这种情况下使用安全一词毫无意义。你有什么顾虑?
  • 保护商店并不意味着我们一直锁定商店 .. 这意味着通过相机密切关注客户 ..
  • 请扩展这个问题。为什么需要传递数组?你在寻找什么“安全”?数组包含什么?应用程序的上下文是什么?就现在这样,它很模糊,不会给你一个好的答案......

标签: php arrays http post


【解决方案1】:

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

PHP 有一个serialize 函数用于此特定目的。传递给它一个数组,它会给你一个字符串表示形式。当您想将其转换回数组时,只需使用unserialize 函数即可。

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

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

附录

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

【讨论】:

  • 如果我现在遇到这个要求,我可能会尝试使用某种形式的加密签名来验证数据。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你可以把它放在会话中:

    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
    • 我有一个问题。如果表单中有数千个输入,同样的事情会起作用吗?
    【解决方案4】:

    有两点需要考虑:用户可以修改表单,并且您需要防止跨站脚本 (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() 来保护您的输入。这会将&amp;lt; 等字符编码为&amp;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(一个数字)是安全的,因为您可以检查该数字是否存在,然后从数据库中提取文件名(这假设您的数据库包含经过验证的输入)。由于上述原因,文件 Name 不安全。您必须重新验证文件名,否则我可以将其更改为任何内容。

    【讨论】:

    • htmlspecialchars() 应该应用于所有用户输入。 StackOverflow 可能与您的用户名类似:它随处可见,因此不能是恶意 HTML。用户可以修改他们正在查看的任何 HTML。我这样做是为了在其中一场 Google 奥运会上伪造高分:sphotos-b.xx.fbcdn.net/hphotos-ash4/… 表单很特别,因为它们包含用户发送回服务器的输入。您需要检查他们发送给您的每个输入,以确保其有意义,否则人们会入侵您的网站。
    【解决方案5】:

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

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

    这完全取决于你真正想要做什么。

    【讨论】:

    • 会话和发布数据是两个非常不同的东西,应该用于不同的数据。说只是将数组保存到会话变量 忽略了它们之间的差异。可能是对的,也可能是错的。从提供的问题中,我们根本无法判断...
    • 我也想过,但是如果我忘记清除 $_SESSION 变量,或者发生了阻止它的事情,那将是一个问题
    • @user1722791 如果客户更改了隐藏输入中的值,您也可能会搞砸。
    • 阅读完所有内容后,似乎 $_SESSION 是最可取的。我会试试这个。
    猜你喜欢
    • 2012-06-23
    • 2014-04-30
    • 2018-06-09
    • 2015-04-02
    • 2012-03-08
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多