前言
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中传输了。
解码则是一个逆向过程,将-
替换为+
,将_
替换为/
,还有补上=
号。文章来源:https://uudwc.com/A/12gLr
urlsafe版本的base64
编解码示例(PHP):文章来源地址https://uudwc.com/A/12gLr
// 编码
function urlsafeB64Encode($input)
{
return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
}
// 解码
function urlsafeB64Decode($input)
{
$remainder = strlen($input) % 4;
if ($remainder) {
$padlen = 4 - $remainder;
$input .= str_repeat('=', $padlen);
}
return base64_decode(strtr($input, '-_', '+/'));
}