通过GET参数传递原始base64编码的字符串是否安全?
当前回答
对于url安全编码,如Python中的base64.urlsafe_b64encode(…),下面的代码对我来说是100%的
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
其他回答
我不认为这是安全的,因为例如,“=”字符在原始基数64中使用,也用于区分参数与HTTP GET中的值。
我倾向于发布一些澄清,因为这里的一些答案有点误导(如果不是不正确的话)。
答案是否定的,你不能简单地在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()输入是安全的,但是,这是多余的,因此是不必要的。
不,你需要对它进行url编码,因为base64字符串可以包含“+”,“=”和“/”字符,这可能会改变你的数据的含义-看起来像一个子文件夹。
下面是有效的base64字符。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
对于url安全编码,如Python中的base64.urlsafe_b64encode(…),下面的代码对我来说是100%的
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
是也不是。
base64的基本字符集在某些情况下可能与url中使用的传统约定相冲突。但许多base64实现允许您更改字符集以更好地匹配url,甚至提供一个字符集(如Python的urlsafe_b64encode())。
您可能面临的另一个问题是URL长度的限制,或者更确切地说-缺乏这样的限制。由于标准没有规定任何最大长度,浏览器、服务器、库和其他使用HTTP协议的软件可能会定义自己的限制。
推荐文章
- 在PHP单元测试执行期间,如何在CLI中输出?
- 在PHP中使用heredoc的优势是什么?
- PHP中的echo, print和print_r有什么区别?
- 如何删除表中特定列的第一个字符?
- 我应该如何从字符串中删除所有的前导空格?- - - - - -斯威夫特
- 将整数转换为字符串,以逗号表示千
- 如何将XML转换成PHP数组?
- 将JavaScript字符串中的多个空格替换为单个空格
- 如何将对象转换为数组?
- printf()和puts()在C语言中的区别是什么?
- 从IP地址获取位置
- jQuery -替换字符串中某个字符的所有实例
- Base64长度计算?
- 使用split("|")按管道符号拆分Java字符串
- 获取数组值的键名