Dalam PHP apa yang dimaksud dengan fungsi yang aman-biner?

120

Dalam PHPapa yang dimaksud dengan suatu fungsi binary-safe?

Apa yang membuatnya istimewa dan di mana biasanya digunakan?

Zacky112
sumber

Jawaban:

106

Ini berarti fungsi akan bekerja dengan benar ketika Anda meneruskannya ke data biner arbitrer (yaitu string yang berisi byte non-ASCII dan / atau byte nol).

Misalnya, fungsi non-biner-aman mungkin didasarkan pada fungsi C yang mengharapkan string yang dihentikan null, jadi jika string berisi karakter null, fungsi tersebut akan mengabaikan apa pun setelahnya.

Ini relevan karena PHP tidak memisahkan data string dan biner dengan rapi.

Michael Borgwardt
sumber
2
Apakah itu berarti string aman biner hanya berisi "karakter" dengan panjang 1 byte?
Charlie Parker
3
@CharlieParker: Tidak, Anda mendapatkannya terbalik. Keamanan biner adalah properti dari fungsi yang berarti mereka memproses string apa pun dengan benar. Kebalikannya adalah string yang hanya berisi karakter ASCII dan tidak ada karakter null - string seperti itu harus diproses dengan benar oleh fungsi apa pun.
Michael Borgwardt
mungkin saya bingung karena saya membaca protokol redis untuk "string massal" dan dikatakan bahwa mereka mewakili string "aman biner biner tunggal". Saya rasa saya memahami posting Anda dengan benar sekarang. Namun, apakah masuk akal untuk mengatakan bahwa string adalah "aman biner" (seperti dalam contoh yang saya berikan)?
Charlie Parker
93

Pengguna lain sudah menyebutkan apa binary safeartinya secara umum.

Dalam PHP, artinya lebih spesifik, hanya mengacu pada contoh yang diberikan Michael.

Semua string dalam PHP memiliki panjang yang terkait, yang merupakan jumlah byte yang menyusunnya. Ketika suatu fungsi memanipulasi string, itu bisa:

  1. Andalkan meta-data panjang itu.
  2. Bergantung pada string yang diakhiri null, yaitu setelah data yang sebenarnya merupakan bagian dari string, byte dengan nilai 0akan muncul.

Juga benar bahwa semua variabel string PHP yang dimanipulasi oleh mesin juga diakhiri dengan null. Masalah dengan fungsi yang bergantung pada 2., adalah, jika string itu sendiri berisi byte dengan nilai 0, fungsi yang memanipulasinya akan mengira string telah berakhir pada titik itu dan akan mengabaikan semuanya setelah itu.

Misalnya, jika strlenfungsi PHP bekerja seperti pustaka standar C strlen, hasilnya di sini akan salah:

$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
Artefacto
sumber
15
Akhirnya sebuah contoh!
Raffaele
5
Dalam pengujian saya di PHP 7.0, fungsi strlen () adalah fungsi aman biner.
linjie
@ Artefacto: Apakah Anda mengatakan bahwa fungsi PHP bawaan strlen()adalah fungsi aman-biner ? Saya mengonfirmasi dari Anda karena di halaman Manual PHP untuk fungsi strlen()tersebut tidak disebutkan apakah itu fungsi aman biner atau fungsi aman non-biner . Satu-satunya hal yang hilang dari Manual PHP ini membuat kebingungan dalam pikiran saya, jadi saya ingin memastikannya dari Anda. Saya sangat menantikan balasan Anda. Terima kasih.
PHPLover
@PHPLover yes strlen () aman biner. jalankan php -r 'var_dump("\x00\x00\x00");'untuk memverifikasi, tetapi strlen php telah biner aman untuk waktu yang sangat lama, sejak setidaknya php 4.x (yang mengatakan, ada kekejian yang disebut "mb_overload", tetapi mari kita anggap itu tidak ada - php.net /manual/en/mbstring.overload.php )
hanshenrik
62

Contoh lainnya:

<?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.

?>

\xmenunjukkan notasi heksadesimal. Lihat: string PHP

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

Tabel ASCII untuk melihat daftar karakter ASCII

Subscriberius
sumber
Hanya untuk memastikan saya mengerti, maka Hello\r\nWORLDtidak boleh sama dengan Hellojika fungsinya aman biner, bukan?
Charlie Parker
Juga, bagaimana fungsi seperti itu diimplementasikan? Apakah ada ekspresi reguler yang memeriksa bahwa binernya aman atau menggunakan metode yang berbeda?
Charlie Parker
@ Subscriberius: Apakah fungsi bawaan strlen() aman-biner ?
PHPNut