通过GET参数传递原始base64编码的字符串是否安全?
当前回答
是也不是。
base64的基本字符集在某些情况下可能与url中使用的传统约定相冲突。但许多base64实现允许您更改字符集以更好地匹配url,甚至提供一个字符集(如Python的urlsafe_b64encode())。
您可能面临的另一个问题是URL长度的限制,或者更确切地说-缺乏这样的限制。由于标准没有规定任何最大长度,浏览器、服务器、库和其他使用HTTP协议的软件可能会定义自己的限制。
其他回答
或者不写辅助函数,你可以直接urlencode base64编码的字符串。这将完成与helper函数完全相同的事情,但不需要两个额外的函数。
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
我不认为这是安全的,因为例如,“=”字符在原始基数64中使用,也用于区分参数与HTTP GET中的值。
不,你需要对它进行url编码,因为base64字符串可以包含“+”,“=”和“/”字符,这可能会改变你的数据的含义-看起来像一个子文件夹。
下面是有效的base64字符。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
如果你安装了钠扩展,需要编码二进制数据,你可以使用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
我倾向于发布一些澄清,因为这里的一些答案有点误导(如果不是不正确的话)。
答案是否定的,你不能简单地在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()输入是安全的,但是,这是多余的,因此是不必要的。
推荐文章
- 致命错误:未找到类“SoapClient”
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- 用javascript检查输入字符串中是否包含数字
- 我目前使用的是哪个版本的CodeIgniter ?
- 合并两个PHP对象的最佳方法是什么?
- 如何使HTTP请求在PHP和不等待响应
- 发送附件与PHP邮件()?
- 如何获得当前的路线在Symfony 2?
- Java:检查enum是否包含给定的字符串?
- 我可以把我所有的http://链接都改成//吗?
- 用PHP删除字符串的前4个字符
- 如何从字符串的开始或结束删除所有空白?
- 字符串到JS中的对象
- 为什么Python的原始字符串不能以一个反斜杠结尾?