En PHP
¿qué significa una función siendo binary-safe
?En PHP, ¿qué significa que una función sea binaria segura?
¿Qué los hace especiales y dónde se suelen usar?
En PHP
¿qué significa una función siendo binary-safe
?En PHP, ¿qué significa que una función sea binaria segura?
¿Qué los hace especiales y dónde se suelen usar?
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.
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:
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!
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
Mejor explicado. –
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? –
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? –
¿Eso quiere decir que las cadenas binarias de seguridad sólo contienen "personajes" de longitud de 1 byte? –
@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. –
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é)? –