通过GET参数传递原始base64编码的字符串是否安全?
当前回答
还有其他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, '._-', '+/='));
}
其他回答
我不认为这是安全的,因为例如,“=”字符在原始基数64中使用,也用于区分参数与HTTP GET中的值。
它是一个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规范。(详见表格)。但实际上你需要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, '._-', '+/='));
}
我倾向于发布一些澄清,因为这里的一些答案有点误导(如果不是不正确的话)。
答案是否定的,你不能简单地在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()输入是安全的,但是,这是多余的,因此是不必要的。
如果你安装了钠扩展,需要编码二进制数据,你可以使用sodium_bin2base64函数,它允许你选择url安全的变量。
例如,编码可以这样完成:
$string = sodium_bin2base64($binData, SODIUM_BASE64_VARIANT_URLSAFE);
和解码:
$result = sodium_base642bin($base64String, SODIUM_BASE64_VARIANT_URLSAFE);
有关使用的更多信息,请查看php文档:
https://www.php.net/manual/en/function.sodium-bin2base64.php https://www.php.net/manual/en/function.sodium-base642bin.php
推荐文章
- 我应该如何从字符串中删除所有的前导空格?- - - - - -斯威夫特
- 将整数转换为字符串,以逗号表示千
- 如何将XML转换成PHP数组?
- 将JavaScript字符串中的多个空格替换为单个空格
- 如何将对象转换为数组?
- printf()和puts()在C语言中的区别是什么?
- 从IP地址获取位置
- jQuery -替换字符串中某个字符的所有实例
- Base64长度计算?
- 使用split("|")按管道符号拆分Java字符串
- 获取数组值的键名
- HTTPS和SSL3_GET_SERVER_CERTIFICATE:证书验证失败,CA is OK
- Std::cin输入空格?
- PHP -获取bool值,当为false时返回false
- 在foreach中通过引用传递