IT박스

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

itboxs 2020. 7. 30. 10:13
반응형

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


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

무엇이 특별하고 일반적으로 어디에 사용됩니까?


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

예를 들어, 이진이 아닌 함수는 널 (null)로 끝나는 문자열을 예상하는 C 함수를 기반으로 할 수 있으므로 문자열에 널 문자가 있으면 함수는 그 이후의 모든 것을 무시합니다.

PHP는 문자열과 이진 데이터를 완전히 분리하지 않기 때문에 관련이 있습니다.


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

PHP에서, 그 의미는보다 구체적이며, Michael이 예제로 제공 한 것만 언급합니다.

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

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

참고 : https://stackoverflow.com/questions/3264514/in-php-what-does-it-mean-by-a-function-being-binary-safe

반응형