Was bedeutet es in PHP, wenn eine Funktion binärsicher ist?

119

In PHPwas bedeutet es , durch eine Funktion zu sein binary-safe?

Was macht sie besonders und wo werden sie normalerweise verwendet?

Zacky112
quelle

Antworten:

106

Dies bedeutet, dass die Funktion ordnungsgemäß funktioniert, wenn Sie beliebige Binärdaten übergeben (dh Zeichenfolgen, die Nicht-ASCII-Bytes und / oder Null-Bytes enthalten).

Beispielsweise könnte eine nicht binär sichere Funktion auf einer C-Funktion basieren, die nullterminierte Zeichenfolgen erwartet. Wenn die Zeichenfolge also ein Nullzeichen enthält, würde die Funktion alles danach ignorieren.

Dies ist relevant, da PHP Zeichenfolgen- und Binärdaten nicht sauber voneinander trennt.

Michael Borgwardt
quelle
2
Bedeutet das, dass binäre sichere Zeichenfolgen nur "Zeichen" mit einer Länge von 1 Byte enthalten?
Charlie Parker
3
@CharlieParker: Nein, das hast du rückwärts verstanden. Binäre Sicherheit ist eine Eigenschaft von Funktionen , dh sie verarbeiten jede Zeichenfolge korrekt. Die Umkehrung wäre eine Zeichenfolge, die nur ASCII-Zeichen und keine Nullzeichen enthält. Eine solche Zeichenfolge sollte von jeder Funktion korrekt verarbeitet werden.
Michael Borgwardt
Vielleicht war ich verwirrt, weil ich das Redis-Protokoll für "Bulk-Strings" gelesen habe und es besagte, dass sie einen "Single Binary Binary Safe" -String darstellen. Ich glaube, ich verstehe Ihren Beitrag jetzt richtig. Ist es jedoch sinnvoll zu sagen, dass eine Zeichenfolge "binär sicher" ist (wie in dem von mir bereitgestellten Beispiel)?
Charlie Parker
93

Die anderen Benutzer haben bereits erwähnt, was binary safeim Allgemeinen bedeutet.

In PHP ist die Bedeutung spezifischer und bezieht sich nur auf das, was Michael als Beispiel gibt.

Allen Zeichenfolgen in PHP ist eine Länge zugeordnet, die der Anzahl der Bytes entspricht, aus denen sie bestehen. Wenn eine Funktion eine Zeichenfolge bearbeitet, kann sie entweder:

  1. Verlassen Sie sich auf diese Länge Metadaten.
  2. Verlassen Sie sich darauf, dass die Zeichenfolge nullterminiert ist, dh dass nach den Daten, die tatsächlich Teil der Zeichenfolge sind, ein Byte mit Wert 0angezeigt wird.

Es ist auch wahr, dass alle von der Engine manipulierten String-PHP-Variablen ebenfalls nullterminiert sind. Das Problem bei Funktionen, die auf 2. basieren, besteht darin, dass, wenn die Zeichenfolge selbst ein Byte mit Wert enthält 0, die Funktion, die sie manipuliert, denkt, dass die Zeichenfolge an diesem Punkt beendet ist, und danach alles ignoriert.

Wenn beispielsweise die PHP- strlenFunktion wie die C-Standardbibliothek funktioniert strlen, ist das Ergebnis hier falsch:

$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
Artefakt
quelle
15
Endlich ein Beispiel!
Raffaele
5
In meinem Test in PHP 7.0 ist die Funktion strlen () eine binäre sichere Funktion.
Linjie
@Artefacto: Wollen Sie damit sagen , dass die eingebaute PHP - Funktion strlen()a binary safe - Funktion? Ich bestätige dies von Ihnen, da auf der PHP-Handbuchseite für die Funktion strlen()nicht erwähnt wurde, ob es sich um eine binärsichere Funktion oder eine nicht-binärsichere Funktion handelt. Dieses einzige fehlende Ding im PHP-Handbuch schafft die Verwirrung in meinem Kopf, deshalb möchte ich es von Ihnen bestätigen. Ich freue mich sehr auf Ihre Antwort. Danke.
PHPLover
@PHPLover yes strlen () ist binär sicher. Führen Sie php -r 'var_dump("\x00\x00\x00");'zur Überprüfung aus, aber PHPs Strlen ist seit sehr langer Zeit binär sicher , da mindestens PHP 4.x (das heißt, es gibt einen Gräuel namens "mb_overload", aber lassen Sie uns einfach so tun, als ob das nicht existiert - php.net /manual/de/mbstring.overload.php )
hanshenrik
62

Mehr Beispiele:

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

?>

\xzeigt die hexadezimale Notation an. Siehe: PHP-Strings

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

ASCII-Tabelle , um die ASCII-Zeichenliste anzuzeigen

Subscriberius
quelle
Nur um sicherzugehen, dass ich verstanden habe, Hello\r\nWORLDsollte es nicht dasselbe sein, als Helloob die Funktion binär sicher ist, oder?
Charlie Parker
Wie wird eine solche Funktion implementiert? Gibt es einen regulären Ausdruck, der überprüft, ob er binär sicher ist, oder verwendet er eine andere Methode?
Charlie Parker
@Subscriberius: Ist der eingebaute Funktion strlen() binary safe ?
PHPNut