将数组从php存储到html输入元素中

时间:2018-06-11 10:16:44

标签: javascript php html arrays

我需要将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>

但我无法这样做。 我该如何存储数组?

2 个答案:

答案 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:

http://php.net/manual/en/function.htmlentities.php