在CodeIgniter中使用Base64编码字符串作为URL参数

6
我有一个加密的、base64编码的数组,我需要将它放入URL中,并插入到我们发送给客户的电子邮件中,以便他们能够被唯一地识别-问题在于,base64_encode()函数通常会在其字符串之后附加一个或两个=符号,默认情况下CI不允许这样做。
以下是一个例子: http://example.com/cec/pay_invoice/VXpkUmJnMWxYRFZWTEZSd0RXZFRaMVZnQWowR2N3TTdEVzRDZGdCbkQycFFaZ0JpQmd4V09RRmdWbkVMYXdZbUJ6OEdZQVJ1QlNJTU9Bb3RWenNFSmxaaFVXcFZaMXQxQXpWV1BRQThVVEpUT0ZFZ0RRbGNabFV6VkNFTlpsTWxWV29DTmdackEzQU5Nd0lpQURNUGNGQS9BRFlHWTFacUFTWldOZ3M5QmpRSGJBWTlCREVGWkF4V0NtQlhiZ1IzVm1CUk9sVm5XMllEWlZaaEFHeFJZMU51VVdNTmJsdzNWVzlVT0EwZw== 现在我知道我可以在config.php中允许=符号,但我不完全理解这样做的安全影响(它一定被禁用了,对吧?)
有人知道为什么允许=符号可能是一个坏主意吗?
谢谢! 约翰。

是的,它确实被加密和编码了。 - John Hunt
如果您使用分段,CI不允许使用'='。如果启用查询字符串,则'='将是完全合法的(当然)。 - Damien Pirsy
4个回答

19

不确定为什么禁用=,但您也可以省略等号。

$base_64 = base64_encode($data);
$url_param = rtrim($base_64, '=');
// and later:
$base_64 = $url_param . str_repeat('=', strlen($url_param) % 4);
$data = base64_decode($base_64);

根据base64规范,只有字符串末尾允许出现=符号,并且它们仅用于填充,没有任何数据丢失的风险。

编辑:有可能不允许出现此选项是为了保证兼容性。从安全角度来看,我想不到任何理由,但在工具链的某个地方进行查询字符串解析时可能会出现问题。


3
请在您的config.php文件中的$config ['permitted_uri_chars']添加字符“ =”,您可以在application / config文件夹中找到该文件。

2

原本,url中没有任何有害字符。但是由于缺乏经验的开发人员或不良编写的软件,一些字符变得恶意。

至于等于号= - 我认为在url中使用它没有任何问题。


1

不必更新配置文件,您可以使用PHP本地的urlencode和urldecode函数。

$str=base64_encode('test');
$url_to_be_send=urlencode($str);
//send it via url

//now on reciveing side

//assuming value passed via get is stored in $encoded_str

$decoded_str=base64_decode(urldecode($encoded_str));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接