에서 PHP
무엇 함수가 됨으로써 의미합니까 binary-safe
?
그것들을 특별하게 만드는 것은 무엇이며 일반적으로 어디에 사용됩니까?
답변
이는 임의의 이진 데이터 (예 : 비 ASCII 바이트 및 / 또는 널 바이트를 포함하는 문자열)를 전달할 때 함수가 올바르게 작동 함을 의미합니다.
예를 들어, 바이너리 안전이 아닌 함수는 null로 끝나는 문자열을 예상하는 C 함수를 기반으로 할 수 있으므로 문자열에 null 문자가 포함 된 경우 함수는 그 이후의 모든 것을 무시합니다.
이것은 PHP가 문자열과 이진 데이터를 명확하게 분리하지 않기 때문에 관련이 있습니다.
답변
다른 사용자가 이미 언급 한 내용 binary safe
일반적인 의미를 했습니다.
PHP에서 의미는 더 구체적이며 Michael이 예로 든 것만 언급합니다.
PHP의 모든 문자열에는 길이가 연결되어 있으며, 이는이를 구성하는 바이트 수입니다. 함수가 문자열을 조작 할 때 다음 중 하나를 수행 할 수 있습니다.
- 그 길이의 메타 데이터에 의존하십시오.
- 문자열로 끝나는 문자열에 의존합니다. 즉, 실제로 문자열의 일부인 데이터 뒤에 값
0
이 있는 바이트 가 나타납니다.
엔진이 조작하는 모든 문자열 PHP 변수도 null로 끝나는 것도 사실입니다. 2에 의존하는 함수의 문제는 문자열 자체에 value가있는 바이트가 포함되어 있으면이를 0
조작하는 함수는 문자열이 해당 지점에서 끝났다고 생각하고 그 이후의 모든 것을 무시한다는 것입니다.
예를 들어, PHP가 strlen
함수가 C 표준 라이브러리처럼 작동 과 같은 strlen
결과는 잘못된 것입니다.
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
답변
더 많은 예 :
<?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
16 진수 표기법을 나타냅니다. 참조 : PHP 문자열
0x00 = NULL
0x04 = EOT (End of transmission)