2010-07-16 21 views

Respuesta

82

Significa que la función funcionará correctamente cuando pase datos binarios arbitrarios (es decir, cadenas que contengan bytes no ASCII y/o bytes nulos).

Por ejemplo, una función que no sea binaria segura podría basarse en una función C que espera cadenas terminadas en nulo, por lo que si la cadena contiene un carácter nulo, la función ignoraría cualquier cosa después de ella.

Esto es relevante porque PHP no separa limpiamente datos binarios y de cadena.

+0

¿Eso quiere decir que las cadenas binarias de seguridad sólo contienen "personajes" de longitud de 1 byte? –

+2

@CharlieParker: No, lo tienes al revés. La seguridad binaria es una propiedad de * functions *, lo que significa que procesan * cualquier cadena * correctamente. Lo contrario sería una cadena que contiene solo caracteres ASCII * y * sin caracteres nulos: una cadena de caracteres debe procesarse correctamente con cualquier función. –

+0

tal vez me confundí porque estaba leyendo el protocolo redis para "cadenas masivas" y decía que representan una cadena de "binario único binario seguro". Creo que entiendo tu publicación correctamente ahora. Sin embargo, ¿tiene sentido decir que una cadena es "binaria segura" (como en el ejemplo que proporcioné)? –

69

Los otros usuarios ya han mencionado lo que significa binary safe en general.

En PHP, el significado es más específico, refiriéndose solo a lo que Michael da como ejemplo.

Todas las cadenas en PHP tienen una longitud asociada, que es la cantidad de bytes que la componen. Cuando una función manipula una cadena, puede:

  1. Confíe en los metadatos de esa longitud.
  2. Confíe en que la cadena tenga terminación nula, es decir, que después de los datos que realmente forman parte de la cadena, aparecerá un byte con el valor 0.

También es cierto que todas las variables PHP de cadena manipuladas por el motor también tienen terminación nula. El problema con las funciones que se basan en 2. es que, si la cadena contiene un byte con el valor 0, la función que lo está manipulando pensará que la cadena ha finalizado en ese punto e ignorará todo después de eso.

Por ejemplo, si la función de PHP strlen trabajó como C biblioteca estándar strlen, el resultado aquí sería un error:

$str = "abc\x00abc"; 
echo strlen($str); //gives 7, not 3! 
+10

¡Finalmente un ejemplo! – Raffaele

+0

Buena explicación –

+1

En mi prueba en PHP 7.0, la función strlen() es una función binaria segura. – linjie

43

Más ejemplos:

<?php 

    $string1 = "Hello"; 
    $string2 = "Hello\x00World"; 

    // This function is NOT ! binary safe 
    echo strcoll($string1, $string2); // gives 0, strings are equal. 

    // This function is binary safe 
    echo strcmp($string1, $string2); // gives <0, $string1 is less than $string2. 

?> 

\x indica notación hexadecimal . Ver: PHP strings

0x00 = NULL 
0x04 = EOT (End of transmission) 

ASCII table para ver la lista de carbón ASCII

+4

Mejor explicado. –

+0

Solo para asegurarme de que entendí, entonces 'Hello \ r \ nWORLD' no debería ser lo mismo que' Hello' si la función es binaria segura, ¿no? –

+0

Además, ¿cómo se implementa esta función? ¿Hay una expresión regular que compruebe que es binario seguro o usa un método diferente? –

Cuestiones relacionadas