2010-07-16 4 views

Répondre

82

Cela signifie que la fonction fonctionne correctement lorsque vous passez des données binaires arbitraires (à savoir des chaînes contenant octets non-ASCII et/ou des octets nuls). Par exemple, une fonction non binaire peut être basée sur une fonction C qui attend des chaînes à terminaison nulle, donc si la chaîne contient un caractère nul, la fonction ignorera tout ce qui la suit.

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

+0

Est-ce que cela veut dire que les chaînes de sécurité binaires ne contiennent que « caractères » de longueur 1 octet? –

+2

@CharlieParker: Non, vous avez ça en arrière. La sécurité binaire est une propriété de * functions * ce qui signifie qu'ils traitent * any * string correctement. L'inverse serait une chaîne qui contient seulement des caractères ASCII * et * aucun caractère nul - une telle chaîne devrait être traitée correctement par n'importe quelle fonction. –

+0

peut-être que je suis confus parce que je lisais le protocole redis pour "les chaînes en bloc" et il a dit qu'ils représentent une chaîne "binaire binaire unique". Je pense que je comprends votre message correctement maintenant. Cependant, est-il logique de dire qu'une chaîne est "binaire sûre" (comme dans l'exemple que j'ai fourni)? –

69

Les autres utilisateurs déjà mentionné ce binary safe signifie en général.

En PHP, le sens est plus spécifique, se référant uniquement à ce que Michael donne comme exemple.

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

  1. Compter sur cette longueur de métadonnées.
  2. compter sur la chaîne étant zéro terminal, à savoir que, après les données qui sont en fait une partie de la chaîne, un octet de valeur 0 apparaît.

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

Par exemple, si la fonction de PHP strlen a travaillé comme C bibliothèque standard strlen, ici le résultat serait une erreur:

$str = "abc\x00abc"; 
echo strlen($str); //gives 7, not 3! 
+10

Enfin un exemple! – Raffaele

+0

Bonne explication –

+1

Dans mon test de PHP 7.0, la fonction strlen() est une fonction de sécurité binaire. – linjie

43

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

?> 

\x indique la notation hexadécimale . Voir: PHP strings

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

ASCII table voir liste char ASCII

+4

Meilleur expliqué. –

+0

Juste pour m'assurer que j'ai compris, alors 'Hello \ r \ nWORLD' ne devrait pas être le même que' Hello' si la fonction est binaire sûre, non? –

+0

En outre, 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-il une méthode différente? –