在URL中传递base64编码的string

通过GETparameter passing原始的base64编码的string是否安全?

不,您需要对它进行url编码,因为base64string可以包含可能会改变数据含义的“+”,“=”和“/”字符 – 看起来像是一个子文件夹。

下面是有效的base64字符。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= 

还有额外的base64规格。 (请参阅表格以了解具体情况)。 但基本上你需要65个字符进行编码:26小写+ 26大写+ 10位= 62。

你需要两个['+','/']和一个填充字符'='。 但是他们都没有友好的url,所以只要使用不同的字符 ,你就可以设置。 上面图表中的标准字符是[' – ','_'],但只要您对它们进行解码,就可以使用其他字符,而不需要与其他人共享。

我build议只写你自己的帮手。 像这些来自base64_encode的php手册页上的注释:

 function base64_url_encode($input) { return strtr(base64_encode($input), '+/=', '._-'); } function base64_url_decode($input) { return base64_decode(strtr($input, '._-', '+/=')); } 

@joeshmo或者,而不是写一个帮助函数,你可以urlencode base64编码的string。 这样做和辅助函数完全一样,但不需要两个额外的函数。

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

介绍性的说明我倾向于发表一些澄清,因为这里的一些答案是有点误导(如果不是不正确的)。

答案是否定的 ,因为加号被转换为$ _GET全局数组中的空格,所以不能简单地在URL查询string中传递base64编码的参数。 换句话说,如果你发送了test.php?myVar = stringwith +符号

 //test.php print $_GET['myVar']; 

结果将是:
stringwith sign

解决这个问题的简单方法是在将base64string添加到查询string之前将urlencode()简单地urlencode()转义为%##代码的+,=和/字符。 例如, urlencode("stringwith+sign")返回stringwith%2Bsign

处理动作时,PHP在填充$ _GET全局时自动解码查询string。 例如,如果我发送test.php?myVar = stringwith%2Bsign to

 //test.php print $_GET['myVar']; 

结果将是:
stringwith+sign

你不想urldecode()返回$ _GETstring作为+将被转换为空格。
换句话说,如果我发送了相同的test.php?myVar = stringwith%2Bsign

 //test.php $string = urldecode($_GET['myVar']); print $string; 

结果是意外的:
stringwith sign

对input进行rawurldecode()是安全的,但是,这将是多余的,因此是不必要的。

是和不是。

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

您可能面临的另一个问题是URL长度的限制,或者更确切地说 – 缺less这样的限制。 由于标准没有规定任何最大长度,浏览器,服务器,库和其他使用HTTP协议的软件可以定义自己的限制。 你可以看看这篇文章: WWW常见问题:一个URL的最大长度是多less?

它的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)); } 

我不认为这是安全的,因为例如“=”字符在原始基址64中使用,并且也用于区分来自HTTP GET中的值的参数。

理论上,是的,只要你不超过客户端或服务器的最大URL和/或查询string长度。

事实上,事情可能会变得棘手。 例如,如果该值恰好包含“on”,并且在尾部“==”中,则可能触发ASP.NET上的HttpRequestValidationException。

是的,它总是安全的。 当然base64包含: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=但是一个base64编码的string通常没有++会被转换成空格,导致错误的解码string。 /在获取参数对中是安全的。 =总是在base64编码的string的末尾,服务器端可以直接parsing=