[php] PHP에서 함수가 바이너리 안전하다는 것은 무엇을 의미합니까?

에서 PHP무엇 함수가 됨으로써 의미합니까 binary-safe?

그것들을 특별하게 만드는 것은 무엇이며 일반적으로 어디에 사용됩니까?



답변

이는 임의의 이진 데이터 (예 : 비 ASCII 바이트 및 / 또는 널 바이트를 포함하는 문자열)를 전달할 때 함수가 올바르게 작동 함을 의미합니다.

예를 들어, 바이너리 안전이 아닌 함수는 null로 끝나는 문자열을 예상하는 C 함수를 기반으로 할 수 있으므로 문자열에 null 문자가 포함 된 경우 함수는 그 이후의 모든 것을 무시합니다.

이것은 PHP가 문자열과 이진 데이터를 명확하게 분리하지 않기 때문에 관련이 있습니다.


답변

다른 사용자가 이미 언급 한 내용 binary safe 일반적인 의미를 했습니다.

PHP에서 의미는 더 구체적이며 Michael이 예로 든 것만 언급합니다.

PHP의 모든 문자열에는 길이가 연결되어 있으며, 이는이를 구성하는 바이트 수입니다. 함수가 문자열을 조작 할 때 다음 중 하나를 수행 할 수 있습니다.

  1. 그 길이의 메타 데이터에 의존하십시오.
  2. 문자열로 끝나는 문자열에 의존합니다. 즉, 실제로 문자열의 일부인 데이터 뒤에 값 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.

?>

\x16 진수 표기법을 나타냅니다. 참조 : PHP 문자열

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

ASCII 문자 목록을 보려면 ASCII 테이블


답변