通过GET参数传递原始base64编码的字符串是否安全?
当前回答
我不认为这是安全的,因为例如,“=”字符在原始基数64中使用,也用于区分参数与HTTP GET中的值。
其他回答
我不认为这是安全的,因为例如,“=”字符在原始基数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));
}
如果你安装了钠扩展,需要编码二进制数据,你可以使用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和/oor查询字符串长度。
在实践中,事情可能会变得有点棘手。例如,它可以在ASP上触发HttpRequestValidationException。如果该值碰巧包含“on”,并且您在后面留下“==”。
还有其他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, '._-', '+/='));
}