PHP:从base64_decode

时间:2018-02-13 17:27:43

标签: php arrays url encode

我想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>

编码会破坏数组,有没有一种方便的方法可以再次从字符串中生成关联数组?

(编码的网址不是敏感信息,但我仍然不希望它在网址中可读取。如果有更好的方法在页面之间传递此数据而不是我正在做的事情,请告诉我)

2 个答案:

答案 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));

Demo

然而您需要小心并彻底检查您收到的内容,因为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披露。