通过GET参数传递原始base64编码的字符串是否安全?
当前回答
或者不写辅助函数,你可以直接urlencode base64编码的字符串。这将完成与helper函数完全相同的事情,但不需要两个额外的函数。
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
其他回答
我倾向于发布一些澄清,因为这里的一些答案有点误导(如果不是不正确的话)。
答案是否定的,你不能简单地在URL查询字符串中传递base64编码的参数,因为加号在$_GET全局数组中被转换为空格。换句话说,如果你发送test。php?myvar# = stringwith +标志
//test.php
print $_GET['myVar'];
结果将是: stringwith标志
解决这个问题的简单方法是urlencode()您的base64字符串,然后将其添加到查询字符串中,以转义+,=和/字符为%##代码。 例如,urlencode("stringwith+sign")返回stringwith%2Bsign
在处理操作时,PHP在填充$_GET全局变量时自动解码查询字符串。 例如,如果我发送test。php?myvar# = stringwith % 2 bsign
//test.php
print $_GET['myVar'];
结果是: stringwith +标志
你不希望urldecode()返回的$_GET字符串,因为+将被转换为空格。 换句话说,如果我发送相同的test。php?myvar# = stringwith % 2 bsign
//test.php
$string = urldecode($_GET['myVar']);
print $string;
结果出乎意料: stringwith标志
rawurldecode()输入是安全的,但是,这是多余的,因此是不必要的。
或者不写辅助函数,你可以直接urlencode base64编码的字符串。这将完成与helper函数完全相同的事情,但不需要两个额外的函数。
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
它是一个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));
}
是也不是。
base64的基本字符集在某些情况下可能与url中使用的传统约定相冲突。但许多base64实现允许您更改字符集以更好地匹配url,甚至提供一个字符集(如Python的urlsafe_b64encode())。
您可能面临的另一个问题是URL长度的限制,或者更确切地说-缺乏这样的限制。由于标准没有规定任何最大长度,浏览器、服务器、库和其他使用HTTP协议的软件可能会定义自己的限制。
还有其他base64规范。(详见表格)。但实际上你需要65个字符来编码:26个小写字母+ 26个大写字母+ 10个数字= 62。
你还需要两个['+','/']和一个填充字符'='。但是没有一个是url友好的,所以使用不同的字符,你就设置好了。上面图表中的标准字符是['-','_'],但你可以使用其他字符,只要你对它们进行相同的解码,并且不需要与他人共享。
我建议你编写自己的助手。像下面这些来自php手册页base64_encode的注释:
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '._-');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '._-', '+/='));
}
推荐文章
- 是否可以为iPhone应用程序(如YouTube和地图)注册一个基于http+域的URL方案?
- PHP中的echo和print有什么不同?
- 我如何使用Guzzle发送一个POST请求JSON?
- 使用Pandas为字符串列中的每个值添加字符串前缀
- 我如何能匹配一个字符串与正则表达式在Bash?
- 如何POST JSON数据与PHP卷曲?
- 在PHP中使用getter和setter而不是函数或简单的公共字段有什么优点?
- 非加密用途的最快哈希?
- 将变量传递到下一页
- 如何测试一个字符串是否包含列表中的一个子字符串,在熊猫?
- 使用curl在PHP中获取HTTP代码
- 如何转换/解析从字符串到字符在java?
- 如何删除数组元素,然后重新索引数组?
- 如何将Base64字符串转换为位图图像,以显示在一个ImageView?
- 在c#中验证字符串只包含字母