En PHP, qu'est-ce que cela signifie par une fonction binaire sûre?

120

En PHPquoi signifie être fonction binary-safe?

Qu'est-ce qui les rend spéciaux et où sont-ils généralement utilisés?

Zacky112
la source

Réponses:

106

Cela signifie que la fonction fonctionnera correctement lorsque vous lui passerez des données binaires arbitraires (c'est-à-dire des chaînes contenant des octets non ASCII et / ou des octets nuls).

Par exemple, une fonction non sécurisée pour les binaires peut être basée sur une fonction C qui attend des chaînes terminées par null, donc si la chaîne contient un caractère nul, la fonction ignorera tout ce qui suit.

Ceci est pertinent car PHP ne sépare pas proprement les données de chaîne et les données binaires.

Michael Borgwardt
la source
2
Cela signifie-t-il que les chaînes de sécurité binaires ne contiennent que des "caractères" d'une longueur de 1 octet?
Charlie Parker
3
@CharlieParker: Non, vous avez ça à l'envers. La sécurité binaire est une propriété des fonctions, ce qui signifie qu'elles traitent n'importe quelle chaîne correctement. L'inverse serait une chaîne contenant uniquement des caractères ASCII et aucun caractère nul - une telle chaîne devrait être traitée correctement par n'importe quelle fonction.
Michael Borgwardt
peut-être ai-je été confus parce que je lisais le protocole redis pour les "chaînes en vrac" et il a dit qu'ils représentent une chaîne "binaire binaire sûre". Je pense que je comprends bien votre message maintenant. Cependant, est-il logique de dire qu'une chaîne est "binaire sûre" (comme dans l'exemple que j'ai fourni)?
Charlie Parker
93

Les autres utilisateurs ont déjà mentionné ce que binary safesignifie en général.

En PHP, le sens est plus précis, se référant uniquement à ce que Michael donne à titre d'exemple.

Toutes les chaînes en PHP ont une longueur associée, qui est le nombre d'octets qui la composent. Lorsqu'une fonction manipule une chaîne, elle peut soit:

  1. Fiez-vous à cette longueur de méta-données.
  2. Fiez-vous au fait que la chaîne se termine par un zéro, c'est-à-dire qu'après les données qui font réellement partie de la chaîne, un octet avec une valeur 0apparaîtra.

Il est également vrai que toutes les variables PHP de type chaîne manipulées par le moteur sont également terminées par null. Le problème avec les fonctions qui reposent sur 2., est que, si la chaîne elle-même contient un octet avec une valeur 0, la fonction qui la manipule pensera que la chaîne s'est terminée à ce point et ignorera tout par la suite.

Par exemple, si la strlenfonction de PHP fonctionnait comme la bibliothèque standard C strlen, le résultat ici serait faux:

$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
Artefacto
la source
15
Enfin un exemple!
Raffaele
5
Dans mon test en PHP 7.0, la fonction strlen () est une fonction de sécurité binaire.
linjie
@Artefacto: Êtes-vous en train de dire que la fonction PHP intégrée strlen()est une fonction de sécurité binaire ? Je confirme de votre part parce que sur la page du manuel PHP pour la fonction, strlen()il n'est pas mentionné que ce soit une fonction de sécurité binaire ou une fonction de sécurité non binaire . Cette seule chose qui manque dans le manuel PHP crée la confusion dans mon esprit, donc je veux le confirmer de votre part. J'attends avec impatience votre réponse. Merci.
PHPLover le
@PHPLover yes strlen () est sécurisé pour les binaires. exécutez php -r 'var_dump("\x00\x00\x00");'pour vérifier, mais strlen de php est binaire sûr depuis très longtemps, depuis au moins php 4.x (cela dit, il existe une abomination appelée "mb_overload", mais prétendons simplement que cela n'existe pas - php.net /manual/en/mbstring.overload.php )
hanshenrik
62

Plus d'exemples:

<?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.

?>

\xindique la notation hexadécimale. Voir: chaînes PHP

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

Table ASCII pour voir la liste des caractères ASCII

Abonné
la source
Juste pour être sûr d'avoir bien compris, cela Hello\r\nWORLDne devrait pas être la même chose que Hellosi la fonction était binaire sûre, non?
Charlie Parker
Aussi, comment une telle fonction est-elle implémentée? Existe-t-il une expression régulière qui vérifie que son binaire est sûr ou utilise-t-elle une méthode différente?
Charlie Parker
@Subscriberius: La fonction intégrée est strlen() -elle sûre pour les binaires ?
PHPNut