Em PHP, o que significa uma função segura para binários?

120

O PHPque significa ser funçãobinary-safe ?

O que os torna especiais e onde são normalmente usados?

Zacky112
fonte

Respostas:

106

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.

Michael Borgwardt
fonte
2
Isso significa que as cadeias binárias seguras contêm apenas "caracteres" com comprimento de 1 byte?
Charlie Parker
3
@CharlieParker: Não, você entendeu ao contrário. A segurança binária é uma propriedade das funções, o que significa que elas processam qualquer string corretamente. O inverso seria uma string que contém apenas caracteres ASCII e nenhum caractere nulo - tal string deve ser processada corretamente por qualquer função.
Michael Borgwardt
talvez eu tenha ficado confuso porque estava lendo o protocolo redis para "strings em massa" e dizia que elas representam uma string "segura binária única e binária". Eu acho que entendi sua postagem corretamente agora. No entanto, faz sentido dizer que uma string é "binária segura" (como no exemplo que forneci)?
Charlie Parker
93

Os outros usuários já mencionaram o que binary safesignifica 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:

  1. Confie nesses metadados de comprimento.
  2. Confie no fato de a string ter terminação nula, ou seja, após os dados que realmente fazem parte da string, um byte com o valor 0aparecerá.

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 strlenfunçã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!
Artefacto
fonte
15
Finalmente um exemplo!
Raffaele
5
Em meu teste no PHP 7.0, a função strlen () é uma função binária segura.
linjie
@Artefacto: Você está dizendo que a função embutida do PHP 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.
PHPLover de
@PHPLover yes strlen () é binário seguro. executar 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 )
hanshenrik
62

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.

?>

\xindica notação hexadecimal. Veja: strings PHP

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

Tabela ASCII para ver a lista de caracteres ASCII

Subscriberius
fonte
Só para ter certeza de que entendi, então Hello\r\nWORLDnão deve ser o mesmo que Hellose a função fosse binária segura, certo?
Charlie Parker
Além disso, como essa função é implementada? Existe uma expressão regular que verifica se seu binário é seguro ou usa um método diferente?
Charlie Parker
@Subscriberius: A função integrada é strlen() binária-segura ?
PHPNut