PHP'de bir işlevin ikili güvenlikli olması ne anlama gelir?


120

Gelen PHPne bir fonksiyon olmakla demek binary-safe?

Onları özel yapan nedir ve genellikle nerede kullanılırlar?

Yanıtlar:


106

Bu, işlevin isteğe bağlı ikili verileri (yani ASCII olmayan bayt ve / veya boş bayt içeren dizeler) ilettiğinizde doğru çalışacağı anlamına gelir.

Örneğin, ikili olmayan güvenli bir işlev, boş sonlu dizeler bekleyen bir C işlevine dayanıyor olabilir, bu nedenle dizge bir boş karakter içeriyorsa, işlev ondan sonraki her şeyi göz ardı eder.

Bu önemlidir çünkü PHP dizge ve ikili verileri temiz bir şekilde ayırmaz.


2
Bu, ikili güvenli dizelerin yalnızca 1 bayt uzunluğunda "karakterler" içerdiği anlamına mı gelir?
Charlie Parker

3
@CharlieParker: Hayır, tersten anladın. İkili güvenlik, işlevlerin bir özelliğidir, yani herhangi bir dizeyi doğru şekilde işleyebilirler . Tersi, yalnızca ASCII karakterleri içeren ve boş karakter içermeyen bir dize olacaktır - böyle bir dize, herhangi bir işlev tarafından doğru şekilde işlenmelidir.
Michael Borgwardt

belki de "toplu dizeler" için redis protokolünü okuduğum ve "tek ikili ikili güvenli" dizeyi temsil ettiklerini söylediği için kafam karıştı. Artık gönderinizi doğru anladığımı düşünüyorum. Bununla birlikte, bir dizenin "ikili güvenli" olduğunu söylemek mantıklı mıdır (verdiğim örnekte olduğu gibi)?
Charlie Parker

93

Diğer kullanıcılar zaten binary safegenel olarak ne anlama geldiğinden bahsetti .

PHP'de anlam daha belirgindir, sadece Michael'ın örnek olarak verdiği şeye atıfta bulunur.

PHP'deki tüm dizelerin, onu oluşturan baytların sayısı olan ilişkili bir uzunluğu vardır. Bir işlev bir dizeyi işlediğinde, şunlardan biri yapabilir:

  1. Bu uzunluktaki meta verilere güvenin.
  2. Boş sonlu dizgeye güvenin, yani dizgenin aslında parçası olan veriden sonra değeri olan bir bayt 0görünecektir.

Motor tarafından işlenen tüm dizge PHP değişkenlerinin de boş sonlandırıldığı doğrudur. 2'ye dayanan işlevlerle ilgili sorun, dizenin kendisi değerli bir bayt içeriyorsa 0, onu işleyen işlev dizenin o noktada bittiğini düşünecek ve bundan sonraki her şeyi yok sayacaktır.

Örneğin, PHP'nin strlenişlevi C standart kitaplığı gibi çalışıyorsa strlen, buradaki sonuç yanlış olur:

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

15
Nihayet bir örnek!
Raffaele

5
PHP 7.0'daki testimde strlen () işlevi ikili güvenli bir işlevdir.
linjie

@Artefacto: yerleşik PHP fonksiyonu söylüyorsunuz strlen()bir olan ikili güvenli işlev? Sizden onaylıyorum çünkü işlev için PHP Kılavuzu sayfasında ikili güvenli işlev mi yoksa ikili olmayan güvenli işlev strlen()mi olduğundan bahsedilmemiştir . PHP Kılavuzundaki bu tek eksik şey zihnimde kafa karışıklığı yaratıyor, bu yüzden bunu sizden onaylamak istiyorum. Cevabınızı merakla bekliyorum. Teşekkür ederim.
PHPLover

@PHPLover evet strlen () ikili güvenlidir. php -r 'var_dump("\x00\x00\x00");'doğrulamak için çalıştırın , ancak php'nin strlen'i çok uzun bir süredir ikili güvenlidir , çünkü en azından php 4.x (bununla birlikte, "mb_overload" adında bir iğrençlik vardır, ancak bunun yokmuş gibi davranalım - php.net /manual/en/mbstring.overload.php )
hanshenrik

62

Daha fazla örnek:

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

?>

\xonaltılı gösterimi belirtir. Bakınız: PHP dizeleri

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

ASCII karakter listesini görmek için ASCII tablosu


Sadece anladığımdan emin olmak için, o zaman işlev ikili güvenliymiş Hello\r\nWORLDgibi aynı olmamalı Hello, değil mi?
Charlie Parker

Ayrıca, böyle bir işlev nasıl uygulanır? İkili güvenli olup olmadığını kontrol eden normal bir ifade var mı yoksa farklı bir yöntem mi kullanıyor?
Charlie Parker

@Subscriberius: Yerleşik işlev strlen() ikili güvenli midir?
PHPNut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.