Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

--TEST-- GH-10192 (mb_detect_encoding() results for UTF-7 differ between PHP 8.0 and 8.1) ..

Decoded Output download

--TEST--
GH-10192 (mb_detect_encoding() results for UTF-7 differ between PHP 8.0 and 8.1)
--EXTENSIONS--
mbstring
--FILE--
<?php

$testcases = [
    'non-base64 character after &' => 'A & B',
    'non-base64 character after -' => 'A - B',
    'base64 character before &' => 'A 1& B',
    'base64 character before -' => 'A 1- B',
    'base64 character after &' => 'A &1 B',
    'base64 character after -' => 'A -1 B',
    'base64 character before and after &' => 'A 1&1 B',
    'base64 character before and after -' => 'A 1-1 B',
    'string ends with &' => 'A &',
    'string ends with -' => 'A -',
    '& and -' => 'A &- B',
    '- and &' => 'A -& B',
    'valid direct encoding character ~' => 'A ~ B',
    'invalid direct encoding character ESC' => "A  B",
    'valid direct encoding character ~ after &' => 'A &~ B',
    'invalid direct encoding character ESC after &' => "A & B",
    'valid base64 character between & and -' => 'A &ZeVnLIqe- B', //  in UTF-16BE
    'invalid base64 character between & and -' => 'A &ZeVnLIq- B', //  in UTF-16BE without the last character
    'valid base64 character between & and non-base64 character' => 'A &ZeVnLIqe B',
    'invalid base64 character between & and non-base64 character' => 'A &ZeVnLIq B',
    'valid base64 character between & and base64 character' => 'A &ZeVnLIqe1 B',
    'invalid base64 character between & and base64 character' => 'A &ZeVnLIq1 B',
    'valid base64 character between & and end of string' => 'A &ZeVnLIqe',
    'invalid base64 character between & and end of string' => 'A &ZeVnLIq',
    'valid base64 character using surrogate pair between & and -' => 'A &2GfePQ- B', //  in UTF-16BE
    'invalid base64 character using surrogate pair between & and -' => 'A &2Gc- B', // first 16 bits of  in UTF-16BE
    'valid base64 character using surrogate pair between & and non-base64 character' => 'A &2GfePQ B',
    'invalid base64 character using surrogate pair between & and non-base64 character' => 'A &2Gc B',
    'valid base64 character using surrogate pair between & and base64 character' => 'A &2GfePQ1 B',
    'invalid base64 character using surrogate pair between & and base64 character' => 'A &2Gc1 B',
    'valid base64 character using surrogate pair between & and end of string' => 'A &2GfePQ',
    'invalid base64 character using surrogate pair between & and end of string' => 'A &2Gc'
];

foreach ($testcases as $title => $case) {
    echo $title . PHP_EOL;
    var_dump(mb_detect_encoding($case, 'UTF-8, UTF7-IMAP', true));
    var_dump(mb_detect_encoding($case, 'UTF-8, UTF7-IMAP', false));
    var_dump(mb_detect_encoding($case, 'UTF7-IMAP', true));
    var_dump(mb_detect_encoding($case, 'UTF7-IMAP', false));
    var_dump(mb_check_encoding($case, 'UTF7-IMAP'));
    var_dump(addcslashes(mb_convert_encoding($case, 'UTF-8', 'UTF7-IMAP'), ".."));
    var_dump(mb_get_info('illegal_chars'));
    echo PHP_EOL;
}

?>
--EXPECT--
non-base64 character after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(4) "A ?B"
int(1)

non-base64 character after -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(5) "A - B"
int(1)

base64 character before &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A 1?B"
int(2)

base64 character before -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(6) "A 1- B"
int(2)

base64 character after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(4) "A ?B"
int(3)

base64 character after -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(6) "A -1 B"
int(3)

base64 character before and after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A 1?B"
int(4)

base64 character before and after -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(7) "A 1-1 B"
int(4)

string ends with &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(3) "A ?"
int(5)

string ends with -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(3) "A -"
int(5)

& and -
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(5) "A & B"
int(5)

- and &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A -?B"
int(6)

valid direct encoding character ~
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(5) "A ~ B"
int(6)

invalid direct encoding character ESC
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A ? B"
int(7)

valid direct encoding character ~ after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A ? B"
int(8)

invalid direct encoding character ESC after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A ? B"
int(9)

valid base64 character between & and -
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(13) "A  B"
int(9)

invalid base64 character between & and -
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(11) "A ? B"
int(10)

valid base64 character between & and non-base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(13) "A ?B"
int(11)

invalid base64 character between & and non-base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(10) "A ?B"
int(12)

valid base64 character between & and base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(13) "A ?B"
int(13)

invalid base64 character between & and base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(13) "A ?B"
int(14)

valid base64 character between & and end of string
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(12) "A ?"
int(15)

invalid base64 character between & and end of string
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(9) "A ?"
int(16)

valid base64 character using surrogate pair between & and -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(8) "A  B"
int(16)

invalid base64 character using surrogate pair between & and -
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A ? B"
int(17)

valid base64 character using surrogate pair between & and non-base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(8) "A ?B"
int(18)

invalid base64 character using surrogate pair between & and non-base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(4) "A ?B"
int(19)

valid base64 character using surrogate pair between & and base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(8) "A ?B"
int(20)

invalid base64 character using surrogate pair between & and base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(4) "A ?B"
int(21)

valid base64 character using surrogate pair between & and end of string
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(7) "A ?"
int(22)

invalid base64 character using surrogate pair between & and end of string
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(3) "A ?"
int(23)

Did this file decode correctly?

Original Code

--TEST--
GH-10192 (mb_detect_encoding() results for UTF-7 differ between PHP 8.0 and 8.1)
--EXTENSIONS--
mbstring
--FILE--
<?php

$testcases = [
    'non-base64 character after &' => 'A & B',
    'non-base64 character after -' => 'A - B',
    'base64 character before &' => 'A 1& B',
    'base64 character before -' => 'A 1- B',
    'base64 character after &' => 'A &1 B',
    'base64 character after -' => 'A -1 B',
    'base64 character before and after &' => 'A 1&1 B',
    'base64 character before and after -' => 'A 1-1 B',
    'string ends with &' => 'A &',
    'string ends with -' => 'A -',
    '& and -' => 'A &- B',
    '- and &' => 'A -& B',
    'valid direct encoding character ~' => 'A ~ B',
    'invalid direct encoding character ESC' => "A \x1b B",
    'valid direct encoding character ~ after &' => 'A &~ B',
    'invalid direct encoding character ESC after &' => "A &\x1b B",
    'valid base64 character between & and -' => 'A &ZeVnLIqe- B', //  in UTF-16BE
    'invalid base64 character between & and -' => 'A &ZeVnLIq- B', //  in UTF-16BE without the last character
    'valid base64 character between & and non-base64 character' => 'A &ZeVnLIqe B',
    'invalid base64 character between & and non-base64 character' => 'A &ZeVnLIq B',
    'valid base64 character between & and base64 character' => 'A &ZeVnLIqe1 B',
    'invalid base64 character between & and base64 character' => 'A &ZeVnLIq1 B',
    'valid base64 character between & and end of string' => 'A &ZeVnLIqe',
    'invalid base64 character between & and end of string' => 'A &ZeVnLIq',
    'valid base64 character using surrogate pair between & and -' => 'A &2GfePQ- B', //  in UTF-16BE
    'invalid base64 character using surrogate pair between & and -' => 'A &2Gc- B', // first 16 bits of  in UTF-16BE
    'valid base64 character using surrogate pair between & and non-base64 character' => 'A &2GfePQ B',
    'invalid base64 character using surrogate pair between & and non-base64 character' => 'A &2Gc B',
    'valid base64 character using surrogate pair between & and base64 character' => 'A &2GfePQ1 B',
    'invalid base64 character using surrogate pair between & and base64 character' => 'A &2Gc1 B',
    'valid base64 character using surrogate pair between & and end of string' => 'A &2GfePQ',
    'invalid base64 character using surrogate pair between & and end of string' => 'A &2Gc'
];

foreach ($testcases as $title => $case) {
    echo $title . PHP_EOL;
    var_dump(mb_detect_encoding($case, 'UTF-8, UTF7-IMAP', true));
    var_dump(mb_detect_encoding($case, 'UTF-8, UTF7-IMAP', false));
    var_dump(mb_detect_encoding($case, 'UTF7-IMAP', true));
    var_dump(mb_detect_encoding($case, 'UTF7-IMAP', false));
    var_dump(mb_check_encoding($case, 'UTF7-IMAP'));
    var_dump(addcslashes(mb_convert_encoding($case, 'UTF-8', 'UTF7-IMAP'), "\0..\37\177"));
    var_dump(mb_get_info('illegal_chars'));
    echo PHP_EOL;
}

?>
--EXPECT--
non-base64 character after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(4) "A ?B"
int(1)

non-base64 character after -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(5) "A - B"
int(1)

base64 character before &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A 1?B"
int(2)

base64 character before -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(6) "A 1- B"
int(2)

base64 character after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(4) "A ?B"
int(3)

base64 character after -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(6) "A -1 B"
int(3)

base64 character before and after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A 1?B"
int(4)

base64 character before and after -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(7) "A 1-1 B"
int(4)

string ends with &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(3) "A ?"
int(5)

string ends with -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(3) "A -"
int(5)

& and -
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(5) "A & B"
int(5)

- and &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A -?B"
int(6)

valid direct encoding character ~
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(5) "A ~ B"
int(6)

invalid direct encoding character ESC
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A ? B"
int(7)

valid direct encoding character ~ after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A ? B"
int(8)

invalid direct encoding character ESC after &
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A ? B"
int(9)

valid base64 character between & and -
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(13) "A  B"
int(9)

invalid base64 character between & and -
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(11) "A ? B"
int(10)

valid base64 character between & and non-base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(13) "A ?B"
int(11)

invalid base64 character between & and non-base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(10) "A ?B"
int(12)

valid base64 character between & and base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(13) "A ?B"
int(13)

invalid base64 character between & and base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(13) "A ?B"
int(14)

valid base64 character between & and end of string
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(12) "A ?"
int(15)

invalid base64 character between & and end of string
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(9) "A ?"
int(16)

valid base64 character using surrogate pair between & and -
string(5) "UTF-8"
string(5) "UTF-8"
string(9) "UTF7-IMAP"
string(9) "UTF7-IMAP"
bool(true)
string(8) "A  B"
int(16)

invalid base64 character using surrogate pair between & and -
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(5) "A ? B"
int(17)

valid base64 character using surrogate pair between & and non-base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(8) "A ?B"
int(18)

invalid base64 character using surrogate pair between & and non-base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(4) "A ?B"
int(19)

valid base64 character using surrogate pair between & and base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(8) "A ?B"
int(20)

invalid base64 character using surrogate pair between & and base64 character
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(4) "A ?B"
int(21)

valid base64 character using surrogate pair between & and end of string
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(7) "A ?"
int(22)

invalid base64 character using surrogate pair between & and end of string
string(5) "UTF-8"
string(5) "UTF-8"
bool(false)
string(9) "UTF7-IMAP"
bool(false)
string(3) "A ?"
int(23)

Function Calls

None

Variables

None

Stats

MD5 e7b06cca3fcb87f499e33e98a7e0ae9d
Eval Count 0
Decode Time 105 ms