通过GET参数传递原始base64编码的字符串是否安全?
我不认为这是安全的,因为例如,“=”字符在原始基数64中使用,也用于区分参数与HTTP GET中的值。
不,你需要对它进行url编码,因为base64字符串可以包含“+”,“=”和“/”字符,这可能会改变你的数据的含义-看起来像一个子文件夹。
下面是有效的base64字符。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
是也不是。
base64的基本字符集在某些情况下可能与url中使用的传统约定相冲突。但许多base64实现允许您更改字符集以更好地匹配url,甚至附带一个字符集(如Python的urlsafe_b64encode())。
urlsafe_b64encode()
您可能面临的另一个问题是URL长度的限制,或者更确切地说-缺乏这样的限制。由于标准没有规定任何最大长度,浏览器、服务器、库和其他使用HTTP协议的软件可能会定义自己的限制。
理论上,是的,只要您不超过客户端或服务器的最大url和/oor查询字符串长度。
在实践中,事情可能会变得有点棘手。例如,它可以在ASP上触发HttpRequestValidationException。如果该值碰巧包含“on”,并且您在后面留下“==”。
还有其他base64规范。(详见表在这里)。但实际上你需要65个字符来编码:26个小写字母+ 26个大写字母+ 10个数字= 62。
你还需要两个['+','/']和一个填充字符'='。但是没有一个是url友好的,所以只是使用不同的字符和你设置好了。上面图表中的标准字符是['-','_'],但你可以使用其他字符,只要你对它们进行相同的解码,并且不需要与他人共享。
我建议你编写自己的助手。像下面这些来自base64_encode的PHP手册页的注释:
function base64_url_encode($input) { return strtr(base64_encode($input), '+/=', '._-'); } function base64_url_decode($input) { return base64_decode(strtr($input, '._-', '+/=')); }
或者不写辅助函数,你可以直接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 sign < / p > 解决这个问题的简单方法是在将base64字符串添加到查询字符串之前,简单地urlencode()您的base64字符串,以转义+,=和/字符为%##代码。 例如,urlencode("stringwith+sign")返回stringwith%2Bsign
stringwith sign
urlencode()
urlencode("stringwith+sign")
stringwith%2Bsign
结果将是: stringwith+sign < / p > 你确实不想urldecode()返回的$_GET字符串作为+将被转换为空格 换句话说,如果我发送相同的test.php吗?bsign myvar# = stringwith % 2到
stringwith+sign
urldecode()
//test.php $string = urldecode($_GET['myVar']); print $string;
结果是一个意外: stringwith sign < / p >
rawurldecode()作为输入是安全的,但是,它是多余的,因此是不必要的。
rawurldecode()
它是一个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)); }
对于url安全编码,比如Python中的base64.urlsafe_b64encode(...),下面的代码对我来说是100%的
base64.urlsafe_b64encode(...)
function base64UrlSafeEncode(string $input) { return str_replace(['+', '/'], ['-', '_'], base64_encode($input)); }
如果你安装了钠扩展,需要编码二进制数据,你可以使用sodium_bin2base64函数,它允许你选择url安全的变量。
sodium_bin2base64
例如,编码可以这样完成:
$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 < / p >