답변:
이는 임의의 이진 데이터 (예 : 비 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!
strlen()
가 바이너리 안전 함수라는 말입니까? 함수 에 대한 PHP 매뉴얼 페이지 strlen()
에서 바이너리 안전 함수인지 바이너리 가 아닌 안전한 함수 인지에 대해 언급되지 않았기 때문에 확인 했습니다 . PHP 매뉴얼 에서 유일하게 빠진 것은 내 마음에 혼란을 일으키는 것이므로 확인하고 싶습니다. 나는 당신의 대답을 간절히 기다리고 있습니다. 감사합니다.
php -r 'var_dump("\x00\x00\x00");'
확인하지만, PHP의 strlen 함수는 바이너리 안전하고있다 매우 (즉, "mb_overload"라는 가증가 말했다,하지만 그냥 존재하지 않는 척 할 수 있습니다 최소한의 PHP 4.x의 이후, 오랜 시간 - php.net /manual/en/mbstring.overload.php )
더 많은 예 :
<?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)
Hello\r\nWORLD
와 동일하지 않아야합니다 Hello
.
strlen()
바이너리 안전 합니까?