[转]PHP base64_encode 在URL地址参数编码上使用

因为我使用公钥,使用php的 openssl 加密之后的资料 base64_encode()字符串,然后放入请求 url 中当作参数,urlencode(base64_encode()),然后用 urldecode() 传过来的参数,出现+=丢失的情况,导致 openssl 解密base64_decode()的字符串失败。

我们知道Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,看好是编码,并不是加密。
编码过程不解释了,Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

格式是大小写字母、数字、“=”号、“+”号和“/”号
但“=”等号最多只有两个
正则匹配就是 【 [a-zA-Z0-9=+/]+ 】
所以看到有大小写字母的字符串并且有一个或两个等号结束的。基本可以判断是base64编码
base64不适合直接放在URL里作为参数传输,发现base64编码中有“/” “=”符号。为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充‘=‘号,并将标准Base64中的“+”和“/”分别改成了“_”和“-”,这样就免去了在URL编解码和数据库存储时所要作的转换。

通过下面的函数,完美解决base64编码url的问题了:

//url base64编码
function urlsafe_b64encode($string) {
    $data = base64_encode($string);
    $data = str_replace(array('+','/','='),array('-','_',''),$data);
    return $data;
}

//url base64解码
function urlsafe_b64decode($string) {
    $data = str_replace(array('-','_'),array('+','/'),$string);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    return base64_decode($data);
}
References
  1. PHP BASE64_ENCODE 在URL地址参数编码上使用

原文地址:https://www.cnblogs.com/fsong/p/11516470.html

时间: 2024-08-29 15:30:34

[转]PHP base64_encode 在URL地址参数编码上使用的相关文章

修改url地址参数

使用changeURLPar('http://www.baidu.com?page=2&bb=cc','page',10) 得到结果http://www.baidu.com?page=10&bb=cc //更新url地址参数 function changeURLPar(url, par_name, par_value) { var pattern = par_name + '=([^&]*)'; var replaceText = par_name + '=' + par_valu

URL地址的编码和解码问题

编码:encodeURIComponent() 方法:把URI字符串采用 UTF-8编码格式转化成escape格式的字符串.与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符.所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误.不会被此方法编码的字符:! * ( ) 解码:HttpUtility.UrlDecode() 这种方法主要是用来解决 url地址中的参数带有特殊字符或所传参数需要保密等

js获取当前url地址参数中文乱码问题

网上看了一些关于此问题的文章,都说的不清不楚,有些更是乱七八糟,完全没法看,故此找了一篇能用的,借鉴作为笔记. //首先获取到当前页面的地址栏信息 var url = window.location.href;//获取url地址 var obj = {};//待会用来存放参数的对象 var reg = /\?/;匹配从?截取 if(url.match(reg)) { //判断传入参数,以问号截取,问号后是参数 var chars = url.split('?')[1]; var arr = ch

ASP.NET MVC中获取URL地址参数的两种写法

一.url地址传参的第一种写法 1.通过mvc中默认的url地址书写格式:控制器/方法名/参数 2.实例:http://localhost:39270/RequestDemo/Index/88,默认参数名为id所以名称为id. 如果使用其他名称,后台是无法读取的会报错 二.url地址传参的第二种写法 1.使用?加参数名=参数值的写法,如果有多个参数使用&来连接 http://localhost:39270/RequestDemo/Index?id=88&name=%E5%BC%A0%E4%

使用js修改url地址参数

该方法可以修改url的参数. 例如将 www.baidu.com 修改为 www.baidu.com?name=123 操作为: window.location.href = changeURLArg(window.location.href,'name',123) 1 function changeURLArg(url,arg,arg_val){ 2 var pattern=arg+'=([^&]*)'; 3 var replaceText=arg+'='+arg_val; 4 if(url.

关于网络 URL 地址的编码

python 中 urllib 模块下的 urlencode 方法是专门用来生成合法的网络 url 的工具: 先看一个 urlencode 的编码示例: urlencode 编码示例 上述代码示例运行的结果如下: ![](null http://i2.51cto.com/images/blog/201801/29/63834b3dfcf75fb6655bf0af1054b6fe.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a

获取自身url地址参数

封装方法如下: function getHash(key, url) { var hash; if (!!url) { hash = url.replace(/^.*?[#](.+?)(?:\?.+)?$/, "$1"); hash = (hash == url) ? "" : hash; } else { hash = self.location.hash; } hash = "" + hash; hash = hash.replace(/^[

vue+webpack+vue-cli获取URL地址参数

在没有使用webpack+vue router开发中,想要获取RUL传的参数地址,直接通过一个函数就可以获得. 比如在  www.test.com/test.html?sign=test  地址中,想要获取sign的值,通常的方法是用一个函数, var getUrlStr =  function(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = wi

取url地址参数

let url = 'https://i-beta.cnblogs.com/posts/edit?param1=123&param2=second'let arr = url.split('&'); let obj = new Object(); for (var i = 0; i < arr.length; i++) { obj[arr[i].split('=')[0]] = arr[i].split('=')[1]; } 执行后这里的obj = {param:'123',para