Trong PHP, một hàm an toàn nhị phân có nghĩa là gì?


120

Ý PHPnghĩa của một chức năng là binary-safegì?

Điều gì khiến chúng trở nên đặc biệt và chúng thường được sử dụng ở đâu?

Câu trả lời:


106

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.


2
Điều đó có nghĩa là chuỗi an toàn nhị phân chỉ chứa các "ký tự" có độ dài 1 byte?
Charlie Parker,

3
@CharlieParker: Không, bạn hiểu ngược lại. An toàn nhị phân là một thuộc tính của các hàm có nghĩa là chúng xử lý bất kỳ chuỗi nào một cách chính xác. Converse sẽ là một chuỗi chỉ chứa các ký tự ASCII không chứa các ký tự rỗng - một chuỗi như vậy phải được xử lý chính xác bởi bất kỳ hàm nào.
Michael Borgwardt

có lẽ tôi đã nhầm lẫn vì tôi đang đọc giao thức redis cho "chuỗi số lượng lớn" và nó nói rằng chúng đại diện cho một chuỗi "an toàn nhị phân đơn lẻ". Tôi nghĩ rằng tôi hiểu bài viết của bạn một cách chính xác bây giờ. Tuy nhiên, có hợp lý không khi nói rằng một chuỗi là "nhị phân an toàn" (như trong ví dụ tôi đã cung cấp)?
Charlie Parker

93

Những người dùng khác đã đề cập đến ý binary safenghĩ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ể:

  1. Dựa vào siêu dữ liệu độ dài đó.
  2. Dựa vào chuỗi được kết thúc bằng null, nghĩa là sau dữ liệu thực sự là một phần của chuỗi, một byte có giá trị 0sẽ 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 strlenhà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!

15
Cuối cùng là một ví dụ!
Raffaele

5
Trong thử nghiệm của tôi trong PHP 7.0, hàm strlen () là một hàm an toàn nhị phân.
linjie

@Artefacto: Bạn đang nói rằng hàm PHP tích hợp sẵn 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.
PHPLover 10/02/19

@PHPLover có strlen () là nhị phân an toàn. chạy 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 )
hanshenrik

62

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.

?>

\xcho 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


Chỉ để chắc chắn rằng tôi đã hiểu, sau đó Hello\r\nWORLDkhông nên giống như Hellonếu hàm là nhị phân an toàn, phải không?
Charlie Parker,

Ngoài ra, làm thế nào một chức năng như vậy được thực hiện? Có một biểu thức chính quy nào kiểm tra xem nó có an toàn nhị phân không hay nó sử dụng một phương pháp khác?
Charlie Parker,

@Subscriberius: Hàm strlen() nhị phân tích hợp có an toàn không?
PHPNut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.