通过GET参数传递原始base64编码的字符串是否安全?


当前回答

如果你安装了钠扩展,需要编码二进制数据,你可以使用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

其他回答

或者不写辅助函数,你可以直接urlencode base64编码的字符串。这将完成与helper函数完全相同的事情,但不需要两个额外的函数。

$str = 'Some String';

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );

理论上,是的,只要您不超过客户端或服务器的最大url和/oor查询字符串长度。

在实践中,事情可能会变得有点棘手。例如,它可以在ASP上触发HttpRequestValidationException。如果该值碰巧包含“on”,并且您在后面留下“==”。

是也不是。

base64的基本字符集在某些情况下可能与url中使用的传统约定相冲突。但许多base64实现允许您更改字符集以更好地匹配url,甚至提供一个字符集(如Python的urlsafe_b64encode())。

您可能面临的另一个问题是URL长度的限制,或者更确切地说-缺乏这样的限制。由于标准没有规定任何最大长度,浏览器、服务器、库和其他使用HTTP协议的软件可能会定义自己的限制。

它是一个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