javascript - 将数组从 php 存储到 html 输入元素中
问题描述
我需要将 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>
但我不能这样做。如何存储数组?
解决方案
正如 Erwin 所说,使用 serialize 为管理数据提供了很多好处。但是,如果您不能信任数据的来源,它也存在一些安全风险。
鉴于您想将其注入隐藏字段,您可能不希望用户对其进行编辑。但是您没有隐含的方法来阻止用户更改数据。使用 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;
}
}
推荐阅读
- css - Sonarqube css:如何为前缀为“pr-”的选择器禁用“意外的未知类型”规则
- python-3.x - Tkinter:显示带有自动更新变量的标签
- mysql - 如何在持续交付中为 WordPress 执行高级数据库合并?
- java - @RequestParam not mapping entire string
- python - require() 给出一个参考错误 - Uncaught ReferenceError
- c++ - 为什么 GCC/Clang 不解析具有相同名称的覆盖方法?
- node.js - 不执行 multer 库的测试
- sql - 按表分组,然后将另一个表计数添加到第一个表分组计数中
- java - 如何模拟 SpyBean 的各个方法?
- codeigniter - 如何向codeigniter添加新字段?