前言
base64
是一种常见的的编码格式,它可以把二进制数据编码成一个由大小写英文字母(
a-zA-Z
)、阿拉伯数字(
0-9
),以及三个特殊字符
+
、
/
、
=
组成的字符串。
问题
但是在URL传输中,
+
、
/
、
=
这三个特殊字符是保留字符(或者叫不安全字符),如果将编码后的base64字符串直接用于URL传输,可能会有意外发生。例如,假设base64编码后的字符串是
x+y
,前端访问
https://www.mysite.com?name=x+y
,后端接收到的
name
参数的值却是
x y
,
+
号不见了,变成了空格。
解决方案
一、在传递参数前,先对其进行URL编码
只要我们在传递base64字符串之前对其进行URL编码,这些特殊字符就会被转义,这样就不会影响后端接收参数。PHP代码示例:
$encoded=base64_encode('举头望明月');$params=['name'=>$encoded];$url='https://www.mysite.com?'.http_build_query($params);echo$url;
注:只要参数是以query string(参数放在URL后面),或者是以POST(x-www-form-urlencoded)的形式传输的,都应对参数做URL编码处理。
二、使用urlsafe版本的base64编码
urlsafe版本的
base64
编码,其实就是对编码后的字符串做一些字符替换的操作:
- 将
+
字符替换为-
- 将
/
字符替换为_
- 将
=
字符替换为空字符串(即删除=
字符)
替换后就可以安全在URL中传输了。
解码则是一个逆向过程,将
-
替换为
+
,将
_
替换为
/
,还有补上
=
号。
urlsafe版本的
base64
编解码示例(PHP):
// 编码functionurlsafeB64Encode($input){returnstr_replace('=','',strtr(base64_encode($input),'+/','-_'));}// 解码functionurlsafeB64Decode($input){$remainder=strlen($input)%4;if($remainder){$padlen=4-$remainder;$input.=str_repeat('=',$padlen);}returnbase64_decode(strtr($input,'-_','+/'));}
版权归原作者 自由de单车 所有, 如有侵权,请联系我们删除。