PHP
¿ En qué se entiende por función ser binary-safe
?
¿Qué los hace especiales y dónde se utilizan normalmente?
Significa que la función funcionará correctamente cuando le pase datos binarios arbitrarios (es decir, cadenas que contengan bytes no ASCII y / o bytes nulos).
Por ejemplo, una función no 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 claramente los datos binarios y de cadena.
Los otros usuarios ya mencionaron lo que
binary safe
significa 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
aparecerá un byte con valor .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 en sí contiene un byte con valor
0
, la función que lo está manipulando pensará que la cadena ha terminado en ese punto e ignorará todo después de eso.Por ejemplo, si la
strlen
función de PHP funcionara como la biblioteca estándar de Cstrlen
, el resultado aquí sería incorrecto:fuente
strlen()
es una función binaria segura ? Lo estoy confirmando porque en la página del Manual de PHP para la funciónstrlen()
no se ha mencionado si es una función segura para binarios o una función no segura para binarios . Lo único que falta en el Manual de PHP está creando confusión en mi mente, así que quiero confirmarlo de su parte. Espero ansiosamente su respuesta. Gracias.php -r 'var_dump("\x00\x00\x00");'
a verificar, pero strlen de PHP ha sido seguro binaria por un muy largo tiempo, ya que al menos PHP 4.x (Dicho esto, hay una abominación llamada "mb_overload", pero deja a pretender que no existe - php.net /manual/en/mbstring.overload.php )Más ejemplos:
\x
indica notación hexadecimal. Ver: cadenas PHPTabla ASCII para ver la lista de caracteres ASCII
fuente
Hello\r\nWORLD
no debería ser lo mismo queHello
si la función fuera binaria segura, ¿verdad?strlen()
binaria segura ?