ในPHP
สิ่งที่ไม่ได้หมายถึงโดยฟังก์ชั่นเป็นbinary-safe
?
อะไรทำให้พวกเขาพิเศษและมักใช้ที่ไหน?
ในPHP
สิ่งที่ไม่ได้หมายถึงโดยฟังก์ชั่นเป็นbinary-safe
?
อะไรทำให้พวกเขาพิเศษและมักใช้ที่ไหน?
คำตอบ:
หมายความว่าฟังก์ชันจะทำงานได้อย่างถูกต้องเมื่อคุณส่งผ่านข้อมูลไบนารีโดยพลการ (เช่นสตริงที่มีไบต์ที่ไม่ใช่ ASCII และ / หรือไบต์ว่าง)
ตัวอย่างเช่นฟังก์ชันที่ไม่ใช่ไบนารีปลอดภัยอาจขึ้นอยู่กับฟังก์ชัน C ซึ่งคาดว่าสตริงที่สิ้นสุดด้วยค่า null ดังนั้นหากสตริงมีอักขระว่างฟังก์ชันจะไม่สนใจสิ่งใด ๆ หลังจากนั้น
สิ่งนี้เกี่ยวข้องเนื่องจาก PHP ไม่ได้แยกสตริงและข้อมูลไบนารีออกจากกันอย่างหมดจด
ผู้ใช้รายอื่นได้กล่าวถึงสิ่งที่ binary safe
หมายโดยทั่วไปแล้ว
ใน PHP ความหมายเฉพาะเจาะจงมากขึ้นโดยอ้างอิงเฉพาะสิ่งที่ Michael ยกตัวอย่างเท่านั้น
สตริงทั้งหมดใน PHP มีความยาวที่เกี่ยวข้องซึ่งเป็นจำนวนไบต์ที่ประกอบ เมื่อฟังก์ชันจัดการกับสตริงก็สามารถ:
0
จะปรากฏขึ้นนอกจากนี้ยังเป็นความจริงที่ว่าตัวแปรสตริง PHP ทั้งหมดที่ถูกจัดการโดยเอ็นจิ้นจะถูกยกเลิกด้วย null ปัญหาเกี่ยวกับฟังก์ชันที่ขึ้นอยู่กับ 2. คือถ้าสตริงเองมีไบต์ที่มีค่า0
ฟังก์ชันที่จัดการกับมันจะคิดว่าสตริงสิ้นสุด ณ จุดนั้นและจะไม่สนใจทุกอย่างหลังจากนั้น
ตัวอย่างเช่นหากstrlen
ฟังก์ชันของ PHP ทำงานเหมือนไลบรารีมาตรฐาน C strlen
ผลลัพธ์ที่ได้จะผิด:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
strlen()
เป็นฟังก์ชันไบนารีที่ปลอดภัยหรือไม่? ฉันยืนยันจากคุณเพราะในPHP คู่มือการใช้งานหน้าสำหรับฟังก์ชั่นstrlen()
ก็ไม่ได้รับการกล่าวถึงว่าไม่ว่าจะเป็นไบนารีปลอดภัยฟังก์ชั่นหรือไม่ใช่ไบนารีปลอดภัยฟังก์ชั่น สิ่งเดียวที่ขาดหายไปจากคู่มือ PHPกำลังสร้างความสับสนในใจของฉันดังนั้นฉันจึงต้องการยืนยันจากคุณ ฉันหวังเป็นอย่างยิ่งว่าจะได้รับคำตอบจากคุณ ขอบคุณ.
php -r 'var_dump("\x00\x00\x00");'
เพื่อตรวจสอบ แต่ strlen php ของได้รับความปลอดภัยไบนารีสำหรับมากเวลานานอย่างน้อยตั้งแต่ PHP 4.x (ที่กล่าวว่ามีเป็นที่น่าสะอิดสะเอียนที่เรียกว่า "mb_overload" แต่ช่วยให้เพียงแค่แกล้งทำเป็นว่าไม่อยู่ - 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
แสดงสัญกรณ์เลขฐานสิบหก ดู: สตริง PHP
0x00 = NULL
0x04 = EOT (End of transmission)
ตาราง ASCIIเพื่อดูรายการถ่าน ASCII
Hello\r\nWORLD
ไม่ควรจะเหมือนกับHello
ว่าฟังก์ชันนั้นปลอดภัยแบบไบนารีใช่ไหม?
strlen()
ไบนารีในตัวปลอดภัยหรือไม่?