W PHP
co to znaczy przez funkcję bycia binary-safe
?
Co sprawia, że są wyjątkowe i gdzie są zwykle używane?
Oznacza to, że funkcja będzie działać poprawnie, gdy przekażesz jej dowolne dane binarne (tj. Łańcuchy zawierające bajty inne niż ASCII i / lub bajty zerowe).
Na przykład funkcja niebinarnie bezpieczna może opierać się na funkcji C, która oczekuje ciągów zakończonych znakiem null, więc jeśli ciąg zawiera znak null, funkcja zignoruje wszystko po nim.
Jest to istotne, ponieważ PHP nie oddziela czysto ciągów i danych binarnych.
Inni użytkownicy już wspomnieli, co
binary safe
to ogólnie znaczy.W PHP znaczenie jest bardziej szczegółowe, odwołując się tylko do tego, co Michael podaje jako przykład.
Wszystkie łańcuchy w PHP mają skojarzoną długość, która jest liczbą bajtów, które go tworzą. Gdy funkcja manipuluje łańcuchem, może:
0
.Prawdą jest również, że wszystkie ciągowe zmienne PHP, którymi manipuluje silnik, są również zakończone znakiem null. Problem z funkcjami, które opierają się na 2. polega na tym, że jeśli sam łańcuch zawiera bajt z wartością
0
, funkcja, która nim manipuluje, pomyśli, że łańcuch zakończył się w tym momencie i zignoruje wszystko później.Na przykład, jeśli
strlen
funkcja PHP działałaby jak standardowa biblioteka Cstrlen
, wynik byłby tutaj nieprawidłowy:źródło
strlen()
jest funkcją bezpieczną dla plików binarnych ? Potwierdzam od Ciebie, ponieważ na stronie podręcznika PHP dla funkcjistrlen()
nie wspomniano, czy jest to funkcja bezpieczna binarnie, czy niebinarna funkcja bezpieczna . Ta jedyna brakująca rzecz w podręczniku PHP powoduje zamieszanie w moim umyśle, więc chcę to potwierdzić od Ciebie. Z niecierpliwością czekam na Twoją odpowiedź. Dziękuję Ci.php -r 'var_dump("\x00\x00\x00");'
aby sprawdzić, ale strlen php był binarny bezpieczny od bardzo dawna, od co najmniej php 4.x (to powiedziawszy, istnieje obrzydliwość o nazwie "mb_overload", ale udawajmy, że nie istnieje - php.net /manual/en/mbstring.overload.php )Więcej przykładów:
\x
oznacza notację szesnastkową. Zobacz: ciągi PHPTabela ASCII, aby wyświetlić listę znaków ASCII
źródło
Hello\r\nWORLD
nie powinno być takie samo, jakHello
gdyby funkcja była bezpieczna binarnie, prawda?strlen()
binarnie bezpieczna ?