Json_在php中编码/解码
我在viewJson_在php中编码/解码,php,json,codeigniter,serialization,Php,Json,Codeigniter,Serialization,我在view$all\u set上有一个数组,其中包含一些ID。现在我想使用表单submit在控制器中传递这个数组。为此,我使用了j-son编码和解码 我认为: <?php $all_set=json_encode($all_set); ?> <input type="hidden" name="all_set" value="<?php echo serialize($all_set); ?>"> 这给了我一个错误,我并没有在控制器上得到任何数组。 错误
$all\u set
上有一个数组,其中包含一些ID。现在我想使用表单submit在控制器中传递这个数组。为此,我使用了j-son编码和解码
我认为:
<?php $all_set=json_encode($all_set); ?>
<input type="hidden" name="all_set" value="<?php echo serialize($all_set); ?>">
这给了我一个错误,我并没有在控制器上得到任何数组。
错误:
为什么会这样?请提供帮助。您必须将
htmlspecialchars()
添加到序列化中
<input type="hidden" name="all_set" value="<?php echo htmlspecialchars(serialize($all_set)); ?>">
我添加了^
来标记问题的来源-您的值包含引号,这使浏览器看到此输入时更不像这样:
value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
value="s:26:"{"0":"1","5".....
一旦找到匹配的“
”,它就会简单地关闭字符串。HTML中有一些特殊字符,包括
,&
,“
,如果希望以文字形式传递,则必须将这些字符转换为实体。因此,通过调用htmlspecialchars()
我们转换所有这些字符,标记如下所示:
value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
value="s:26:"{"0":"1","5".....
浏览器现在可以正确地解释它,正确地显示它,并正确地发回,但不能将其视为标记的一部分
编辑2
事实上,非序列化在代码中非常有用。完全摆脱
serialize()
/unserialize()
您的json编码数据只是纯字符串,因此您只需要htmlspecialchars()
您必须将htmlspecialchars()
添加到序列化中
<input type="hidden" name="all_set" value="<?php echo htmlspecialchars(serialize($all_set)); ?>">
我添加了^
来标记问题的来源-您的值包含引号,这使浏览器看到此输入时更不像这样:
value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
value="s:26:"{"0":"1","5".....
一旦找到匹配的“
”,它就会简单地关闭字符串。HTML中有一些特殊字符,包括
,&
,“
,如果希望以文字形式传递,则必须将这些字符转换为实体。因此,通过调用htmlspecialchars()
我们转换所有这些字符,标记如下所示:
value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
value="s:26:"{"0":"1","5".....
浏览器现在可以正确地解释它,正确地显示它,并正确地发回,但不能将其视为标记的一部分
编辑2
事实上,非序列化在代码中非常有用。完全摆脱serialize()
/unserialize()
您的json编码数据只是纯字符串,因此您只需要htmlspecialchars()
试试
<input type="hidden" name="all_set" value="<?php echo base64_encode($all_set); ?>">
$result= base64_decode($result);
$result=json_decode($result);
试试看
为什么要序列化JSON文本?事实上,我是第一次使用JSON将数据发送到contoller,但webnetmobile.com给了我答案。为什么要序列化JSON文本?事实上,我是第一次使用JSON将数据发送到contoller,但webnetmobile.com给了我答案。请告诉我为什么我们必须这样做添加htmlspecialchars()??请检查R的答案。使用unserialize()会使您面临安全漏洞。可怕..gr8解释..gr8帮助..+1explanation@JonathanAmendR.S.提供与使用serialize相同的安全级别。来自用户的任何数据都不可信任。若您构建了一个表单并将数据放在隐藏字段中,然后用户将该表单提交回来,那个么那个里就并没有您的数据了。It用户数据。这些都是用户数据。你必须再次验证它——你一开始把它放在那里完全没有区别。这是任何客户机/服务器代码的经验法则。问题是在表单中使用序列化数据的问题,而不是如何假装理解安全问题。@WebnetMobile.com如果你让某人继续对从用户接收的数据使用unserialize(),你只会把他们引向悬崖边。base64_decode()不存在执行任意代码的风险,而unserialize()具有执行任意代码的风险。你可以告诉我为什么我们要添加htmlspecialchars()吗?请检查R的答案。使用unserialize()会使您面临安全漏洞。可怕..gr8解释..gr8帮助..+1explanation@JonathanAmendR.S.提供与使用serialize相同的安全级别。来自用户的任何数据都不可信任。若您构建了一个表单并将数据放在隐藏字段中,然后用户将该表单提交回来,那个么那个里就并没有您的数据了。It用户数据。这些都是用户数据。你必须再次验证它——你一开始把它放在那里完全没有区别。这是任何客户机/服务器代码的经验法则。问题是在表单中使用序列化数据的问题,而不是如何假装理解安全问题。@WebnetMobile.com如果你让某人继续对从用户接收的数据使用unserialize(),你只会把他们引向悬崖边。base64_decode()不存在执行任意代码的风险,而unserialize()具有执行任意代码的风险。你不妨让他评估一下。虽然这也行得通,但这不是一个完全正确的解决方案,因为你正在解决这个问题,而不是消除真正的罪魁祸首。@WebnetMobile.com这不是真的。R S正确地删除了unserialize()的用法。如果您正在对从用户端提供的数据进行非序列化,您将面临一个非常巨大的安全漏洞,因为传递回脚本的数据可能会被操纵,从而导致服务器执行攻击者希望的任何PHP代码:来自用户的数据都不可信。这就是为什么您总是进行服务器端验证。如果你认为Base64是对这一点的任何形式的保护,那么你就错过了这一点。而这也会起作用,这不是一个完全正确的解决方案,因为你是在工作的问题,而不是移除真正的罪犯。@ WebNETMask.com这是不正确的。R S正确地删除了unserialize()的用法。如果您正在对从用户端提供的数据进行非序列化,您将面临一个非常巨大的安全漏洞,因为传递回脚本的数据可能会被操纵,从而导致服务器执行攻击者希望的任何PHP代码:来自用户的数据都不可信。这就是为什么你总是这么做