首页 > 解决方案 > 将数组从 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>

但我不能这样做。如何存储数组?

标签: javascriptphphtmlarrays

解决方案


正如 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;
    }
 }

推荐阅读