PHP में किसी फ़ंक्शन के द्विआधारी-सुरक्षित होने का क्या मतलब है?


120

में PHPक्या यह एक समारोह होने से क्या मतलब है binary-safe?

क्या उन्हें विशेष बनाता है और वे आमतौर पर कहां उपयोग किए जाते हैं?

जवाबों:


106

इसका मतलब है कि जब आप इसे बाइनरी डेटा (यानी गैर-एएससीआईआई बाइट्स और / या शून्य बाइट्स वाले तार) पास करते हैं तो फ़ंक्शन सही ढंग से काम करेगा।

उदाहरण के लिए, एक गैर-बाइनरी-सुरक्षित फ़ंक्शन एक सी फ़ंक्शन पर आधारित हो सकता है जो अशक्त-समाप्त स्ट्रिंग्स की अपेक्षा करता है, इसलिए यदि स्ट्रिंग में एक अशक्त चरित्र है, तो फ़ंक्शन इसके बाद कुछ भी अनदेखा करेगा।

यह प्रासंगिक है क्योंकि PHP सफाई से अलग स्ट्रिंग और बाइनरी डेटा नहीं करता है।


2
क्या इसका मतलब है कि बाइनरी सुरक्षित तार में केवल लंबाई 1 बाइट के "वर्ण" होते हैं?
चार्ली पार्कर

3
@CharlieParker: नहीं, आपको वह पीछे मिला है। बाइनरी सुरक्षा कार्यों का एक गुण है जिसका अर्थ है कि वे किसी भी स्ट्रिंग को सही ढंग से संसाधित करते हैं । अनुलोम एक स्ट्रिंग होगी जिसमें केवल ASCII वर्ण होते हैं और कोई अशक्त वर्ण नहीं होते हैं - ऐसे तार को किसी भी फ़ंक्शन द्वारा सही ढंग से संसाधित किया जाना चाहिए।
माइकल बोर्गवर्ड

शायद मैं भ्रमित हो गया क्योंकि मैं "बल्क स्ट्रिंग्स" के लिए रेडिस प्रोटोकॉल पढ़ रहा था और यह कहा कि वे "सिंगल बाइनरी बाइनरी सेफ" स्ट्रिंग का प्रतिनिधित्व करते हैं। मुझे लगता है कि मैं आपकी पोस्ट को अब ठीक से समझ रहा हूं। हालांकि, क्या यह कहना समझ में आता है कि एक स्ट्रिंग "बाइनरी सेफ" है (उदाहरण में मैंने जो प्रदान किया है)?
चार्ली पार्कर

93

अन्य उपयोगकर्ताओं ने पहले ही उल्लेख किया है कि binary safeसामान्य रूप से क्या मतलब है।

PHP में, अर्थ अधिक विशिष्ट है, केवल एक उदाहरण के रूप में माइकल क्या देता है, इसका जिक्र करते हुए।

PHP में सभी स्ट्रिंग्स की लंबाई जुड़ी होती है, जो इसे बनाने वाले बाइट्स की संख्या होती है। जब एक फ़ंक्शन स्ट्रिंग में हेरफेर करता है, तो यह या तो हो सकता है:

  1. उस लंबाई मेटा-डेटा पर भरोसा करें।
  2. स्ट्रिंग पर अशक्त होने का अर्थ है, कि डेटा के बाद वास्तव में स्ट्रिंग का हिस्सा है, मूल्य के साथ एक बाइट 0दिखाई देगा।

यह भी सच है कि इंजन द्वारा हेरफेर किए गए सभी स्ट्रिंग PHP चर भी अशक्त हैं। फ़ंक्शंस के साथ समस्या जो 2. पर निर्भर करती है, वह यह है कि, यदि स्ट्रिंग में स्वयं मूल्य के साथ बाइट होता है 0, तो जो फ़ंक्शन इसे हेरफेर कर रहा है वह सोचेंगे कि स्ट्रिंग उस बिंदु पर समाप्त हो गई है और उसके बाद सब कुछ अनदेखा कर देगा।

उदाहरण के लिए, यदि PHP के strlenफ़ंक्शन ने C मानक लाइब्रेरी की तरह काम किया strlen, तो यहां परिणाम गलत होगा:

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

15
अंत में एक उदाहरण!
राफेल

5
PHP 7.0 में मेरे परीक्षण में, strlen () फ़ंक्शन एक बाइनरी सुरक्षित फ़ंक्शन है।
linjie

@Artefacto: क्या आप कह रहे हैं कि अंतर्निहित PHP फ़ंक्शन strlen()एक बाइनरी-सुरक्षित फ़ंक्शन है? मैं आपसे पुष्टि कर रहा हूं क्योंकि फ़ंक्शन के लिए PHP मैनुअल पेज पर strlen()यह उल्लेख नहीं किया गया है कि यह द्विआधारी-सुरक्षित फ़ंक्शन है या गैर-बाइनरी बाइनरी फ़ंक्शन है। PHP मेनुअल से यह केवल गायब चीज़ मेरे दिमाग में भ्रम पैदा कर रही है इसलिए मैं आपसे इसकी पुष्टि करना चाहता हूं। मैं आपके उत्तर की उत्सुकता से प्रतीक्षा कर रहा हूं। धन्यवाद।
PHPLover

@PHPLover हाँ स्ट्रलेन () बाइनरी सुरक्षित है। php -r 'var_dump("\x00\x00\x00");'सत्यापित करने के लिए दौड़ें , लेकिन php का strlen बहुत लंबे समय तक द्विआधारी सुरक्षित रहा है , क्योंकि कम से कम php 4.x (जो कहा गया है, "mb_overload" नामक एक घृणा है, लेकिन यह सिर्फ दिखावा करता है जो मौजूद नहीं है - php.net /manual/en/mbstring.overload.php )
१३:२१ बजे हंसेनक्रिक

62

और ज्यादा उदाहरण:

<?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इंगित करता है हेक्साडेसिमल संकेतन। देखें: PHP स्ट्रिंग्स

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

ASCII चार्ट देखने के लिए ASCII तालिका देखें


बस यह सुनिश्चित करने के लिए कि मुझे समझ में आया है, तब ऐसा Hello\r\nWORLDनहीं होना चाहिए जैसे Helloकि फ़ंक्शन बाइनरी सुरक्षित है, है ना?
चार्ली पार्कर

इसके अलावा, इस तरह के एक समारोह को कैसे लागू किया जाता है? क्या एक नियमित अभिव्यक्ति है जो यह जांचती है कि इसका बाइनरी सुरक्षित है या क्या यह एक अलग विधि का उपयोग करता है?
चार्ली पार्कर

@Subscriberius: क्या फ़ंक्शन strlen() बाइनरी-सेफ में बनाया गया है ?
19 नवंबर को PHPNut
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.