Respostas:
Isso significa que a função funcionará corretamente quando você passar dados binários arbitrários (ou seja, strings contendo bytes não ASCII e / ou bytes nulos).
Por exemplo, uma função de segurança não binária pode ser baseada em uma função C que espera strings terminadas em nulo, portanto, se a string contiver um caractere nulo, a função ignorará qualquer coisa após ele.
Isso é relevante porque o PHP não separa claramente os dados de string e binários.
Os outros usuários já mencionaram o que binary safe
significa em geral.
Em PHP, o significado é mais específico, referindo-se apenas ao que Michael dá como exemplo.
Todas as strings em PHP têm um comprimento associado, que é o número de bytes que as compõem. Quando uma função manipula uma string, ela pode:
0
aparecerá.Também é verdade que todas as variáveis de string do PHP manipuladas pelo mecanismo também são terminadas em nulo. O problema com funções que dependem de 2. é que, se a própria string contiver um byte com valor 0
, a função que a está manipulando pensará que a string terminou naquele ponto e irá ignorar tudo depois disso.
Por exemplo, se a strlen
função do PHP funcionasse como a biblioteca padrão C strlen
, o resultado aqui seria errado:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
strlen()
é uma função binária segura ? Estou confirmando de você porque na página do Manual do PHP para a função strlen()
não foi mencionado se é uma função segura binária ou uma função segura não binária . Essa única coisa que falta no Manual do PHP está criando confusão em minha mente, então eu quero confirmar isso de você. Aguardo ansiosamente a sua resposta. Obrigado.
php -r 'var_dump("\x00\x00\x00");'
para verificar, mas strlen do php foi segura para binários para um muito longo tempo, pelo menos desde php 4.x (que disse, há uma abominação chamada "mb_overload", mas vamos apenas fingir que não existe - php.net /manual/en/mbstring.overload.php )
Mais exemplos:
<?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 notação hexadecimal. Veja: strings PHP
0x00 = NULL
0x04 = EOT (End of transmission)
Tabela ASCII para ver a lista de caracteres ASCII
Hello\r\nWORLD
não deve ser o mesmo que Hello
se a função fosse binária segura, certo?
strlen()
binária-segura ?