我想base64_encode
我通过网址发送的参数。
发送
<?php
$product = array("productID"=>"13776", "name"=>"something", "availability"=>"1000");
$url_details = "?id=" . base64_encode(http_build_query($product));
?>
<a href="details.php<?php echo $url_details; ?>" class="btn btn-primary btn-lg" role="button">Details</a>
接收
<?php
$details = base64_decode($_GET["id"]);
// $product = what is the best way to reconstruct the array from $details?
?>
<p>
Name: <?php echo $products["name"]; ?>
...
</p>
编码会破坏数组,有没有一种方便的方法可以再次从字符串中生成关联数组?
(编码的网址不是敏感信息,但我仍然不希望它在网址中可读取。如果有更好的方法在页面之间传递此数据而不是我正在做的事情,请告诉我)
答案 0 :(得分:3)
你可以serialize()
你的阵列:
<?php
$product = array("productID"=>"13776", "name"=>"something", "availability"=>"1000");
$url_details = base64_encode(serialize($product));
然后,在您的结束页unserialize()上:
<?php
$details = unserialize(base64_decode($url_details));
然而您需要小心并彻底检查您收到的内容,因为unserialize()
将执行客户端发送的任意代码。例如,我可以serialize()
我自己的array
,然后base64_encode()
,并将其传递给id
参数中的网址,我可以做一些非常讨厌的事情。所以一定要检查你在请求中得到的内容!
从手册:
警告
不管将不受信任的用户输入传递给unserialize() allowed_classes的选项值。反序列化可能会导致代码 由于对象实例化和自动加载而被加载和执行, 并且恶意用户可能能够利用它。使用安全,标准 数据交换格式,如JSON(通过json_decode()和 json_encode())如果需要将序列化数据传递给用户。
Here's关于此事的综合性文章。读一读!
正如手册所述,您也可以完成使用json_encode()
和json_decode()
尝试的操作,但同样的警告仍然存在,检查您的内容是什么“得到的就是你应该得到的并消毒它。”
答案 1 :(得分:3)
parse_str与http_build_query相反,因此要恢复您的数据:
parse_str(base64_decode($_GET["id"]), $details);
请注意,如果仅使用一个参数调用,则parse_str是有害的。
另外,您可能不希望将此类信息放入URL中,因为它可以很容易地向第三方via the Referrer header披露。