我需要将php中的数组存储到HTML输入隐藏字段中。
PHP控制器:
$docNames = array();
if(!empty($records))
{
foreach($records as $item)
{
array_push($docNames, $item['description']);
}
}
$this->f3->set('docNames', $docNames);
HTML:
<form>
<input type="hidden" name="docNames[]" value="<?php echo $docNames; ?>">
</form>
但我无法这样做。 我该如何存储数组?
答案 0 :(得分:2)
正如Erwin所说,使用序列化为管理数据提供了很多好处。但是,如果您不相信数据的来源,它也会带来一些安全风险。
鉴于您希望将其注入隐藏字段,您可能不希望用户编辑它。但是,您没有隐含的方法来阻止用户更改数据。使用htmlentities()来逃避数据会产生一些复杂性。听起来你需要这样的东西:
define("MY_SECRET", sesion_id());
function create_form_object($name, $data)
{
$inject=base64_encode(serialize($data));
$valid=sha1(MY_SECRET . $inject);
$payload="$inject/$valid";
return "<input type='hidden' name='$name' value='$payload'>";
}
function retrieve_form_object($name)
{
if (!isset($_REQUEST[$name])) {
trigger_error("Specified object $name does not exist in request");
return false;
}
list($data, $valid)=explode("/", $_REQUEST[$name]);
$check=sha1(MY_SECRET . $data);
if ($check===$valid) {
return unserialize(base64_decode($data));
} else {
trigger_error("bad signature on $name");
return false;
}
}
<强>更新强>
我有点低估了长度扩展攻击的容易程度(感谢jh1711),因此我建议更好的解决方案是:
define("MY_SECRET", sesion_id());
function create_form_object($name, $data)
{
$inject=base64_encode(serialize($data));
$valid=hash_hmac('sha1', $inject, MY_SECRET);
// at a pinch, you could...
// = sha1(MY_SECRET . sha1(MY_SECRET . $inject));
$payload="$inject/$valid";
return "<input type='hidden' name='$name' value='$payload'>";
}
function retrieve_form_object($name)
{
if (!isset($_REQUEST[$name])) {
trigger_error("Specified object $name does not exist in request");
return false;
}
list($data, $valid)=explode("/", $_REQUEST[$name]);
$check=hash_hmac('sha1', $data, MY_SECRET);
// at a pinch, you could...
// = sha1(MY_SECRET . sha1(MY_SECRET . $data));
if ($check===$valid) {
return unserialize(base64_decode($data));
} else {
trigger_error("bad signature on $name");
return false;
}
}
答案 1 :(得分:1)
看看序列化:
http://php.net/manual/en/function.serialize.php
使用unserialize()解包。
另外,请确保编码内容(html中的值)。例如,你不想要&#34;在您的内容中,因为它终止字符串的值。
你可以使用htmlentities: