ใน PHP การที่ฟังก์ชันปลอดภัยเป็นไบนารีหมายความว่าอย่างไร


120

ในPHPสิ่งที่ไม่ได้หมายถึงโดยฟังก์ชั่นเป็นbinary-safe?

อะไรทำให้พวกเขาพิเศษและมักใช้ที่ไหน?

คำตอบ:


106

หมายความว่าฟังก์ชันจะทำงานได้อย่างถูกต้องเมื่อคุณส่งผ่านข้อมูลไบนารีโดยพลการ (เช่นสตริงที่มีไบต์ที่ไม่ใช่ ASCII และ / หรือไบต์ว่าง)

ตัวอย่างเช่นฟังก์ชันที่ไม่ใช่ไบนารีปลอดภัยอาจขึ้นอยู่กับฟังก์ชัน C ซึ่งคาดว่าสตริงที่สิ้นสุดด้วยค่า null ดังนั้นหากสตริงมีอักขระว่างฟังก์ชันจะไม่สนใจสิ่งใด ๆ หลังจากนั้น

สิ่งนี้เกี่ยวข้องเนื่องจาก PHP ไม่ได้แยกสตริงและข้อมูลไบนารีออกจากกันอย่างหมดจด


2
นั่นหมายความว่าสตริงไบนารีปลอดภัยมีเฉพาะ "อักขระ" ที่มีความยาว 1 ไบต์ใช่หรือไม่
Charlie Parker

3
@CharlieParker: ไม่คุณถอยหลังไปแล้ว ความปลอดภัยไบนารีเป็นคุณสมบัติของฟังก์ชันซึ่งหมายความว่าพวกมันประมวลผลสตริงใด ๆได้อย่างถูกต้อง การสนทนาจะเป็นสตริงที่มีเฉพาะอักขระ ASCII และไม่มีอักขระว่าง - สตริงดังกล่าวควรได้รับการประมวลผลอย่างถูกต้องโดยฟังก์ชันใด ๆ
Michael Borgwardt

บางทีฉันอาจสับสนเพราะฉันกำลังอ่านโปรโตคอล redis สำหรับ "สตริงจำนวนมาก" และมันบอกว่ามันเป็นตัวแทนของสตริง "ไบนารีไบนารีปลอดภัยเดียว" ฉันคิดว่าฉันเข้าใจโพสต์ของคุณถูกต้องแล้ว อย่างไรก็ตามมันสมเหตุสมผลหรือไม่ที่จะบอกว่าสตริงเป็น "binary safe" (ดังตัวอย่างที่ฉันให้ไว้)
Charlie Parker

93

ผู้ใช้รายอื่นได้กล่าวถึงสิ่งที่ binary safeหมายโดยทั่วไปแล้ว

ใน PHP ความหมายเฉพาะเจาะจงมากขึ้นโดยอ้างอิงเฉพาะสิ่งที่ Michael ยกตัวอย่างเท่านั้น

สตริงทั้งหมดใน PHP มีความยาวที่เกี่ยวข้องซึ่งเป็นจำนวนไบต์ที่ประกอบ เมื่อฟังก์ชันจัดการกับสตริงก็สามารถ:

  1. อาศัยข้อมูลเมตาที่มีความยาวนั้น
  2. อาศัยสตริงที่ถูกยกเลิกด้วย null กล่าวคือหลังจากข้อมูลที่เป็นส่วนหนึ่งของสตริงจริงไบต์ที่มีค่า0จะปรากฏขึ้น

นอกจากนี้ยังเป็นความจริงที่ว่าตัวแปรสตริง PHP ทั้งหมดที่ถูกจัดการโดยเอ็นจิ้นจะถูกยกเลิกด้วย null ปัญหาเกี่ยวกับฟังก์ชันที่ขึ้นอยู่กับ 2. คือถ้าสตริงเองมีไบต์ที่มีค่า0ฟังก์ชันที่จัดการกับมันจะคิดว่าสตริงสิ้นสุด ณ จุดนั้นและจะไม่สนใจทุกอย่างหลังจากนั้น

ตัวอย่างเช่นหากstrlenฟังก์ชันของ PHP ทำงานเหมือนไลบรารีมาตรฐาน C strlenผลลัพธ์ที่ได้จะผิด:

$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!

15
สุดท้ายเป็นตัวอย่าง!
Raffaele

5
ในการทดสอบของฉันใน PHP 7.0 ฟังก์ชัน strlen () เป็นฟังก์ชันไบนารีปลอดภัย
linjie

@Artefacto: คุณกำลังบอกว่าฟังก์ชัน PHP ในตัวstrlen()เป็นฟังก์ชันไบนารีที่ปลอดภัยหรือไม่? ฉันยืนยันจากคุณเพราะในPHP คู่มือการใช้งานหน้าสำหรับฟังก์ชั่นstrlen()ก็ไม่ได้รับการกล่าวถึงว่าไม่ว่าจะเป็นไบนารีปลอดภัยฟังก์ชั่นหรือไม่ใช่ไบนารีปลอดภัยฟังก์ชั่น สิ่งเดียวที่ขาดหายไปจากคู่มือ PHPกำลังสร้างความสับสนในใจของฉันดังนั้นฉันจึงต้องการยืนยันจากคุณ ฉันหวังเป็นอย่างยิ่งว่าจะได้รับคำตอบจากคุณ ขอบคุณ.
PHPLover

@PHPLover ใช่ strlen () ปลอดภัยแบบไบนารี ทำงานphp -r 'var_dump("\x00\x00\x00");'เพื่อตรวจสอบ แต่ strlen php ของได้รับความปลอดภัยไบนารีสำหรับมากเวลานานอย่างน้อยตั้งแต่ PHP 4.x (ที่กล่าวว่ามีเป็นที่น่าสะอิดสะเอียนที่เรียกว่า "mb_overload" แต่ช่วยให้เพียงแค่แกล้งทำเป็นว่าไม่อยู่ - php.net /manual/en/mbstring.overload.php )
hanshenrik

62

ตัวอย่างเพิ่มเติม:

<?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แสดงสัญกรณ์เลขฐานสิบหก ดู: สตริง PHP

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

ตาราง ASCIIเพื่อดูรายการถ่าน ASCII


เพื่อให้แน่ใจว่าฉันเข้าใจแล้วก็Hello\r\nWORLDไม่ควรจะเหมือนกับHelloว่าฟังก์ชันนั้นปลอดภัยแบบไบนารีใช่ไหม?
Charlie Parker

นอกจากนี้ฟังก์ชันดังกล่าวถูกนำไปใช้อย่างไร? มีนิพจน์ทั่วไปที่ตรวจสอบว่าไบนารีปลอดภัยหรือไม่หรือใช้วิธีการอื่น
Charlie Parker

@Subscriberius: ฟังก์ชันstrlen() ไบนารีในตัวปลอดภัยหรือไม่?
PHPNut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.