在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=
。