2016-03-18 12 views
5

Ho avuto 2 casi in cui i byte null \0 vengono aggiunti ai miei dati.Perché var_dump non mostra byte null?

1.Casting oggetto di un array

class myClass { 
    private $var; 
    function __construct() {} 
} 
$myObject = (array) new myClass(); 
var_dump(array_map("addslashes", array_keys($myObject))); 

Uscite:

array(1) { [0]=> string(14) "\0myClass\0var" } 

2.When decifrare i dati crittografati:

function encrypt_data($data) { 
    return base64_encode(mcrypt_encrypt(MCRYPT_BLOWFISH , SALT , $data , MCRYPT_MODE_ECB)); 
} 

function decrypt_data($data) { 
    $data = base64_decode($data); 
    return mcrypt_decrypt(MCRYPT_BLOWFISH , SALT , $data , MCRYPT_MODE_ECB); 
} 

$data = '123456789aasdasd'; 
$edata = encrypt_data($data); 
var_dump(addslashes(decrypt_data($edata))); 

Uscite:

string(39) "123456789aasdasd\0\0\0\0\0\0\0" 

Ma non avrei mai notato la funzione \0 se non la addslashes. Perché solo var_dump() non li mostra? var_dump("Hello\0 World"); per esempio output 'Hello World'. A mio parere, rappresentazione errata dei dati. E per quanto ne so, \0 byte è fine dell'array di caratteri (stringa in PHP) in C e PHP è implementato in C.

+2

'var_dump (" Hello \ 0 World ");' _does_ mostra il carattere. È il tuo browser che non lo rende chiaro. Prova questo codice dalla riga di comando, ricevo 'string (12)" Hello \ 000 World "' come output. – jszobody

+1

Non vedi \ 0 su MAC 'php -a; php> var_dump ("Hello \ 0 World"); string (12) "Hello World" ' –

+0

Sono su un mac pure .php -a; php> var_dump ("Hello \ 0 World"); string (12) "Hello \ 000 World" 'Non sei sicuro del motivo per cui stai ottenendo risultati diversi – jszobody

risposta

2

var_dump produce stringhe come sono. Se la stringa contiene un byte NUL, il byte NUL verrà emesso così com'è. Il problema è che un byte NUL in genere non viene visualizzato come nulla nel browser, o forse anche nella riga di comando.

Un'indicazione è che la lunghezza della stringa visualizzata è diversa da quella che si vede. A string(42) "abc" probabilmente contiene un numero piuttosto elevato di caratteri "nascosti". Ovviamente questo diventa sempre più difficile da eyeball più lunga diventa la stringa ...

var_export rende NUL byte e simili molto più evidenti.

+0

Questo ha senso per me. Esiste una combinazione di 'var_export()' + 'var_dump()'? –

+0

Non che io sappia. Se hai la sensazione che potresti avere a che fare con caratteri nascosti, dovrai indagare più dettagliatamente. – deceze

Problemi correlati