Php 在URL中传递base64编码字符串

Php 在URL中传递base64编码字符串,php,url,string,get,base64,Php,Url,String,Get,Base64,通过GET参数传递原始base64编码的字符串安全吗?我认为这不安全,因为例如,“=”字符用于原始base64,也用于区分参数与HTTP GET中的值。不,您需要对其进行url编码,因为base64字符串可以包含“+”、“=”和“/”可能改变数据含义的字符-看起来像子文件夹 下面是有效的base64字符 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= 是和否 base64的基本字符集在某些情况下可能与URL中使

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

我认为这不安全,因为例如,“=”字符用于原始base64,也用于区分参数与HTTP GET中的值。

不,您需要对其进行url编码,因为base64字符串可以包含“+”、“=”和“/”可能改变数据含义的字符-看起来像子文件夹

下面是有效的base64字符

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
是和否

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


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

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


实际上,事情可能会变得更棘手。例如,如果该值恰好包含一个“on”,并且您在后面的“==”中留下了其他base64规范,则它可以在ASP.NET上触发HttpRequestValidationException。(详情见下表)。但基本上你需要65个字符来编码:26个小写+26个大写+10个数字=62

您还需要两个['+','/']和一个填充字符'='。但是它们都不是url友好的,所以只需为它们使用不同的字符即可。上面图表中的标准字符是['-',''.'],但是您可以使用其他字符,只要您对它们进行相同的解码,并且不需要与其他人共享

我建议只写你自己的助手。类似于网站上的评论:


@joeshmo或者,您可以对base64编码的字符串进行URL编码,而不是编写帮助函数。这将完成与helper函数完全相同的事情,但不需要两个额外的函数

$str = 'Some String';

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
介绍性说明我倾向于发表一些澄清,因为这里的一些答案有点误导(如果不是错误的话)

答案是否定的,您不能简单地在URL查询字符串中传递base64编码的参数,因为加号被转换为$\u GET全局数组中的空格。换句话说,如果您将test.php?myVar=stringwith+符号发送到

结果将是:
stringwith sign

解决此问题的简单方法是,在将base64字符串添加到查询字符串之前,只需
urlencode()
您的base64字符串,即可将+、=、和/字符转义为%###代码。 例如,
urlencode(“stringwith+sign”)
返回
stringwith%2Bsign

处理该操作时,PHP会在填充$\u GET global时自动解码查询字符串。 例如,如果我将test.php?myVar=stringwith%2Bsign发送到

结果是:
stringwith+符号

您不想
urldecode()
返回的$\u GET字符串as+将被转换为空格。
换句话说,如果我将相同的test.php?myVar=stringwith%2Bsign发送到

结果是意外的:
stringwith sign


输入是安全的,但是它是多余的,因此不必要。

这是一种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\u b64encode(…)
,下面的代码对我来说是100%

函数base64urlsafencode(字符串$input)
{
返回str_replace(['+','/'],['-',''.'],base64_encode($input));
}

您没有提到在某些情况下会使URL无效的+、/、或=字符。URL编码是一种浪费空间的行为,尤其是因为base64本身会留下许多未使用的字符。我不确定我是否理解您的意思-URL编码不会改变除上面列表中最后三个字符以外的任何字符,这是为了防止它们被错误解释,因为它们在URL中有其他含义。base64也是如此,原始数据可以是二进制或任何形式,但它的编码形式可以使用简单的协议轻松传输。首先,您也应该转义“+”,因为它可能会转换为空间。其次,至少有几个字符可以安全地在URL中使用,并且在“标准”字符集中不使用。在某些情况下,您的方法甚至可以将传输数据的大小增加三倍;当用其他字符替换这些字符时,可以在保持相同长度的情况下完成此操作。这也是标准的解决方案它清楚地表明转义“使字符串不必要地变长”,并提到了另一种字符集变体。@MichałGórny如果您使用JSON作为GET参数,则Base 64编码(取决于您的数据)可能会减少请求字符串的大小。(在你说这是一个愚蠢的想法之前,我们在查询字符串中使用JSON来帮助深入链接到我们的应用程序。)对于我们的应用程序,这种方法实现了大约30%的减少。(公平地说,如果完全避免Base64,而是编写我们自己的JSON(反)序列化程序,使用URL编码友好的字符(例如,
(['
而不是
{[“
)。答案很好。如果问题被标记,您可以在这个站点上使用PHP代码,而不需要开始和结束标记。)(通常情况下,从问题的上下文中可以清楚地看出)。如果您在一行末尾添加两个空格,您将看到

,因此无需键入太多HTML。我希望这会有所帮助,我对您的答案进行了一些编辑,以进一步改进。感谢您提到PHP为您解码URL。这使我不会掉进兔子洞。回答很好->您不想这样做
//test.php
print $_GET['myVar'];
//test.php
print $_GET['myVar'];
//test.php
$string = urldecode($_GET['myVar']);
print $string;
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));
}