Câu trả lời:
Nó có nghĩa là hàm sẽ hoạt động chính xác khi bạn truyền cho nó dữ liệu nhị phân tùy ý (tức là các chuỗi chứa byte không phải ASCII và / hoặc byte rỗng).
Ví dụ: một hàm an toàn không phải nhị phân có thể dựa trên một hàm C mong đợi các chuỗi kết thúc bằng null, vì vậy nếu chuỗi chứa ký tự null, hàm sẽ bỏ qua bất kỳ thứ gì sau nó.
Điều này có liên quan vì PHP không phân tách rõ ràng dữ liệu chuỗi và dữ liệu nhị phân.
Những người dùng khác đã đề cập đến ý binary safe
nghĩa nói chung.
Trong PHP, nghĩa cụ thể hơn, chỉ đề cập đến những gì Michael đưa ra làm ví dụ.
Tất cả các chuỗi trong PHP đều có độ dài được liên kết, là số byte tạo nên nó. Khi một hàm thao tác một chuỗi, nó có thể:
0
sẽ xuất hiện.Cũng đúng khi tất cả các biến chuỗi PHP do engine thao tác cũng bị kết thúc bằng null. Vấn đề với các hàm dựa vào 2., đó là nếu bản thân chuỗi chứa một byte có giá trị 0
, thì hàm đang thao tác với nó sẽ nghĩ rằng chuỗi đã kết thúc tại thời điểm đó và sẽ bỏ qua mọi thứ sau đó.
Ví dụ: nếu strlen
hàm của PHP hoạt động giống như thư viện chuẩn C strlen
, kết quả ở đây sẽ sai:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
strlen()
là một hàm an toàn nhị phân ? Tôi xác nhận với bạn vì trên trang Hướng dẫn sử dụng PHP cho hàm, strlen()
nó không được đề cập đến việc đó là hàm an toàn nhị phân hay hàm an toàn không nhị phân . Điều duy nhất còn thiếu trong Hướng dẫn sử dụng PHP đang tạo ra sự bối rối trong tâm trí tôi vì vậy tôi muốn xác nhận điều đó từ bạn. Tôi rất mong được trả lời của bạn. Cảm ơn bạn.
php -r 'var_dump("\x00\x00\x00");'
để xác minh, nhưng strlen của php đã được an toàn nhị phân trong một thời gian rất dài, kể từ ít nhất là php 4.x (có nghĩa là có một điều ghê tởm được gọi là "mb_overload", nhưng hãy cứ giả vờ rằng điều đó không tồn tại - php.net /manual/en/mbstring.overload.php )
Các ví dụ khác:
<?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
cho biết ký hiệu thập lục phân. Xem: Chuỗi PHP
0x00 = NULL
0x04 = EOT (End of transmission)
Bảng ASCII để xem danh sách ký tự ASCII
Hello\r\nWORLD
không nên giống như Hello
nếu hàm là nhị phân an toàn, phải không?
strlen()
nhị phân tích hợp có an toàn không?