In PHP cosa significa che una funzione è sicura per i binari?


120

In PHPche cosa significa essere una funzione binary-safe?

Cosa li rende speciali e dove vengono utilizzati tipicamente?

Risposte:


106

Significa che la funzione funzionerà correttamente quando si passano dati binari arbitrari (cioè stringhe contenenti byte non ASCII e / o byte nulli).

Ad esempio, una funzione non binary-safe potrebbe essere basata su una funzione C che prevede stringhe con terminazione null, quindi se la stringa contiene un carattere null, la funzione ignorerà qualsiasi cosa dopo di essa.

Ciò è rilevante perché PHP non separa in modo pulito i dati stringa e binari.


2
Ciò significa che le stringhe binarie sicure contengono solo "caratteri" di lunghezza 1 byte?
Charlie Parker

3
@CharlieParker: No, l'hai capito al contrario. La sicurezza binaria è una proprietà delle funzioni, il che significa che elaborano correttamente qualsiasi stringa. Il contrario sarebbe una stringa che contiene solo caratteri ASCII e nessun carattere nullo: tale stringa dovrebbe essere elaborata correttamente da qualsiasi funzione.
Michael Borgwardt

forse mi sono confuso perché stavo leggendo il protocollo redis per "stringhe bulk" e diceva che rappresentano una stringa "single binary binary safe". Penso di aver capito correttamente il tuo post ora. Tuttavia, ha senso dire che una stringa è "binary safe" (come nell'esempio che ho fornito)?
Charlie Parker

93

Gli altri utenti hanno già menzionato cosa binary safesignifica in generale.

In PHP, il significato è più specifico, riferendosi solo a ciò che Michael dà come esempio.

Tutte le stringhe in PHP hanno una lunghezza associata, che è il numero di byte che la compongono. Quando una funzione manipola una stringa, può:

  1. Affidati a metadati di questa lunghezza.
  2. Affidati alla stringa che termina con un valore null, ovvero che dopo i dati che fanno effettivamente parte della stringa, 0verrà visualizzato un byte con valore .

È anche vero che tutte le variabili PHP di stringa manipolate dal motore sono anche a terminazione null. Il problema con le funzioni che si basano su 2., è che, se la stringa stessa contiene un byte con valore 0, la funzione che lo sta manipolando penserà che la stringa sia terminata a quel punto e ignorerà tutto dopo.

Ad esempio, se la strlenfunzione di PHP funzionasse come la libreria standard C strlen, il risultato qui sarebbe sbagliato:

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

15
Finalmente un esempio!
Raffaele

5
Nel mio test in PHP 7.0, la funzione strlen () è una funzione binaria sicura.
Linjie

@Artefacto: Stai dicendo che la funzione PHP incorporata strlen()è una funzione binary-safe ? Sto confermando da te perché nella pagina del manuale PHP per la funzione strlen()non è stato menzionato se si tratta di una funzione binary-safe o non-binary safe . Questa unica cosa che manca dal manuale PHP sta creando confusione nella mia mente, quindi voglio confermarlo da te. Attendo con impazienza la tua risposta. Grazie.
PHPL oltre il

@ PHPLover yes strlen () è binario sicuro. corri php -r 'var_dump("\x00\x00\x00");'per verificare, ma lo strlen di php è stato binario sicuro per molto tempo, da almeno php 4.x (detto questo, c'è un abominio chiamato "mb_overload", ma facciamo finta che non esista - php.net /manual/en/mbstring.overload.php )
hanshenrik

62

Altri esempi:

<?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 la notazione esadecimale. Vedi: stringhe PHP

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

Tabella ASCII per vedere l'elenco dei caratteri ASCII


Solo per essere sicuro di aver capito, allora Hello\r\nWORLDnon dovrebbe essere la stessa come Hellose la funzione fosse sicura per i binari, giusto?
Charlie Parker

Inoltre, come viene implementata una tale funzione? Esiste un'espressione regolare che controlla che il suo binario sia sicuro o utilizza un metodo diverso?
Charlie Parker

@ Subscriberius: la funzione integrata è strlen() binary-safe ?
PHPNut
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.