代码之家  ›  专栏  ›  技术社区  ›  Alix Axel

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

  •  206
  • Alix Axel  · 技术社区  · 15 年前

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

    9 回复  |  直到 7 年前
        1
  •  178
  •   Thiyagaraj    15 年前

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

    有效的base64字符如下。

    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
    
        2
  •  247
  •   ArchimedesMP    7 年前

    还有其他base64规格。(见表格) here 具体细节)。但本质上你需要65个字符来编码:26个小写字母+26个大写字母+10个数字=62。

    您还需要两个“+”,“/”]和一个填充字符“=”。但它们都不支持URL,所以 只是用不同的字符 你已经准备好了。上面图表中的标准字符是“-”,“'”,但只要您对其他字符解码相同,并且不需要与其他字符共享,就可以使用其他字符。

    我建议你只写你自己的助手。就像这些评论 php manual page for base64_encode :

    function base64_url_encode($input) {
     return strtr(base64_encode($input), '+/=', '._-');
    }
    
    function base64_url_decode($input) {
     return base64_decode(strtr($input, '._-', '+/='));
    }
    
        3
  •  68
  •   rodrigo-silveira selftaught91    13 年前

    @joeshmo或者不编写helper函数,只需对base64编码的字符串进行urlencode即可。这与助手函数的作用完全相同,但不需要额外的两个函数。

    $str = 'Some String';
    
    $encoded = urlencode( base64_encode( $str ) );
    $decoded = base64_decode( urldecode( $encoded ) );
    
        4
  •  38
  •   Community nesinervink    8 年前

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

    答案是否定的 ,您不能简单地在URL查询字符串中传递base64编码的参数,因为加号被转换为$\u get global数组中的空格。换句话说,如果你发送 测试?PHP?myvar=带+符号的字符串

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

    结果是:
    stringwith sign

    解决这个问题的简单方法是 urlencode() 您的base64字符串,然后将其添加到查询字符串中,以将+、=、和/字符转义为%代码。 例如, urlencode("stringwith+sign") 收益率 stringwith%2Bsign

    当您处理该操作时,PHP会在填充$\u get global时自动解码查询字符串。 例如,如果我发送 测试?PHP?myvar=stringWith%2bsign

    //Test.PHP
    打印$ou get['myvar']
    

    结果是:
    stringwith+sign

    你做 urldecode() 返回的$\u get string as+将转换为空格。
    换言之,如果我发了同样的邮件 测试?PHP?myvar=stringWith%2bsign

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

    结果出乎意料:
    斯特林征

    这样做是安全的 rawurldecode() 但是,输入是多余的,因此是不必要的。

        5
  •  13
  •   Michał Górny    15 年前

    是和不是。

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

    您可能面临的另一个问题是URL长度的限制,或者更确切地说,缺少这样的限制。由于标准没有指定任何最大长度,浏览器、服务器、库和其他使用HTTP协议的软件可能会定义自己的限制。你可以看看这篇文章: WWW FAQs: What is the maximum length of a URL?

        6
  •  7
  •   Andy    9 年前

    它是一个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));
    }
    
        7
  •  4
  •   Mischa    15 年前

    我不认为这是安全的,因为例如“=”字符在raw base 64中使用,也用于区分参数和http g e t中的值。

        8
  •  1
  •   Nicole Calinoiu    15 年前

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

    在实践中,事情会变得更加棘手。例如,如果该值恰好包含“on”,并且您将其保留在尾部“==”,则它可以在ASP.NET上触发httpRequestValidationException。

        9
  •  -6
  •   gouchaoer    7 年前

    是的,它总是安全的。 当然,base64包含: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= 但是base64编码的字符串通常没有 + . + 将转换为空白,导致解码字符串错误。 / 在get参数对中是安全的。 = 总是在base64编码字符串的末尾,服务器端可以解析 = 直接。