Answers:
不,您需要对其进行url编码,因为base64字符串可以包含“ +”,“ =”和“ /”字符,这些字符可能会改变数据的含义-看起来像一个子文件夹。
有效的base64字符如下。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
还有其他base64规格。(有关详细信息,请参见此处的表)。但实际上,您需要65个字符进行编码:26个小写字母+ 26个大写字母+ 10位数字= 62。
您还需要两个['+','/']和一个填充字符'='。但是它们都不是url友好的,因此只需为它们使用不同的字符就可以了。上表中的标准字符为['-','_'],但您可以使用其他字符,只要您对它们进行相同的解码即可,而无需与其他人共享。
我建议只写自己的助手。像这样在base64_encode的php手册页上的注释中:
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '._-');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '._-', '+/='));
}
urlencode
按照Rodrigo-silveira的回答建议使用。创建两个新函数以节省URL长度的几个字符,就像通过窗口进入您的房子而不仅仅是使用门一样。
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
,
应该urlencode到%2C
,我建议使用._-
而不是-_,
像en.wikipedia.org/wiki/Base64#Variants_summary_table中的唯一变体那样,使之保持尾随=
@joeshmo或不用编写辅助函数,也可以对base64编码的字符串进行urlencode。这将与您的辅助函数完全相同,但是不需要两个额外的函数。
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
/
如果不将字符作为GET参数,而是作为URL中的路径传递,请小心字符。如果您没有/
在两侧都替换其他东西,它将改变您的路径。
介绍性说明我倾向于发表一些澄清,因为此处的某些答案有些误导(如果不是错误的话)。
答案是否定的,您不能简单地在URL查询字符串中传递base64编码的参数,因为加号已转换为$ _GET全局数组内的SPACE。换句话说,如果您将test.php?myVar = stringwith + sign发送给
//test.php
print $_GET['myVar'];
结果将是:
stringwith sign
解决此问题的简单方法是简单地urlencode()
将base64字符串添加到查询字符串中,然后将+,=和/字符转义为%##代码。例如,urlencode("stringwith+sign")
返回stringwith%2Bsign
当您处理操作时,PHP会在填充$ _GET全局变量时自动对查询字符串进行解码。例如,如果我将test.php?myVar = stringwith%2Bsign发送给
//test.php
print $_GET['myVar'];
结果将是:
stringwith+sign
你不希望urldecode()
返回$ _GET字符串+的将被转换为空格。
换句话说,如果我将相同的test.php?myVar = stringwith%2Bsign发送给
//test.php
$string = urldecode($_GET['myVar']);
print $string;
结果是意外的:
stringwith sign
rawurldecode()
输入将是安全的,但是它将是多余的,因此是不必要的。
<br>
,因此无需键入太多HTML。希望对您有所帮助,我对您的答案做了一些修改,以进一步改善它。
是的,没有。
在某些情况下,base64的基本字符集可能会与URL中使用的传统约定冲突。但是许多base64实现都允许您更改字符集以更好地匹配URL,甚至与URL一起提供(例如Python urlsafe_b64encode()
)。
您可能面临的另一个问题是URL长度的限制,或者更确切地说,是没有这样的限制。由于标准未指定任何最大长度,因此使用HTTP协议的浏览器,服务器,库和其他软件可能会定义其自身的限制。您可以看一下本文:WWW常见问题解答:URL的最大长度是多少?
您可以尝试使用base64url编码,它只是上述joeshmo代码的扩展。
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
从理论上讲,是的,只要您不超过客户端或服务器的最大url和/或查询字符串长度即可。
在实践中,事情可能会变得有些棘手。例如,如果该值恰好包含一个“ on”,而您留下了结尾的“ ==”,则它可以在ASP.NET上触发HttpRequestValidationException。
对于url安全编码,例如base64.urlsafe_b64encode(...)
在Python中,以下代码对我有效100%
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
是的,它总是安全的。当然base64包含:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
但是base64编码的字符串通常没有+
。+
将转换为空格,导致解码字符串错误。/
在获取参数对中是安全的。=
始终位于base64编码字符串的末尾,服务器端可以=
直接解析。