পিএইচপি-তে কোনও ফাংশন বাইনারি-নিরাপদ হওয়ার অর্থ কী?


119

ইন PHPকি এটি একটি ফাংশন হচ্ছে মানে binary-safe?

তাদের কী বিশেষ করে এবং এগুলি সাধারণত কোথায় ব্যবহৃত হয়?

উত্তর:


106

এর অর্থ এটি যখন আপনি স্বেচ্ছাসেবী বাইনারি ডেটা (যেমন- ASCII নন এবং / অথবা নাল বাইটসযুক্ত স্ট্রিংগুলি) পাস করেন তখন ফাংশনটি সঠিকভাবে কাজ করবে।

উদাহরণস্বরূপ, একটি নন-বাইনারি-নিরাপদ ফাংশন সি ফাংশনের উপর ভিত্তি করে হতে পারে যা নাল-টার্মিনেটেড স্ট্রিংগুলি প্রত্যাশা করে, সুতরাং যদি স্ট্রিংটিতে নাল অক্ষর থাকে তবে ফাংশনটি তার পরে কিছু উপেক্ষা করবে।

এটি প্রাসঙ্গিক কারণ পিএইচপি পরিষ্কারভাবে স্ট্রিং এবং বাইনারি ডেটা আলাদা করে না।


2
এর অর্থ কি বাইনারি নিরাপদ স্ট্রিংগুলিতে কেবল 1 বাইট দৈর্ঘ্যের "অক্ষর" রয়েছে?
চার্লি পার্কার

3
@ চার্লিপার্কার: না, আপনি এটি পিছনের দিকে পেয়েছেন। বাইনারি সুরক্ষা ফাংশনগুলির একটি সম্পত্তি যার অর্থ তারা কোনও স্ট্রিং সঠিকভাবে প্রক্রিয়া করে । কথোপকথনটি এমন একটি স্ট্রিং হবে যাতে কেবলমাত্র ASCII অক্ষর থাকে এবং কোনও নাল অক্ষর থাকে না - এই জাতীয় স্ট্রিংটি কোনও ফাংশন দ্বারা সঠিকভাবে প্রক্রিয়া করা উচিত।
মাইকেল বর্গওয়ার্ট

সম্ভবত আমি বিভ্রান্ত হয়ে পড়েছিলাম কারণ আমি "বাল্ক স্ট্রিং" এর জন্য রেডিস প্রোটোকলটি পড়ছিলাম এবং এটি বলেছিল যে তারা একটি "একক বাইনারি বাইনারি নিরাপদ" স্ট্রিং উপস্থাপন করে। আমি মনে করি এখনই আপনার পোস্টটি সঠিকভাবে বুঝতে পেরেছি। তবে, স্ট্রিংটি "বাইনারি নিরাপদ" (আমি যে উদাহরণ দিয়েছি তার মধ্যে যেমন) তা কী বোঝায়?
চার্লি পার্কার

93

অন্যান্য ব্যবহারকারীরা ইতিমধ্যে binary safeসাধারণভাবে কী বোঝায় তা উল্লেখ করেছে ।

পিএইচপি-তে, অর্থটি আরও সুনির্দিষ্ট, কেবল মাইকেল যা উদাহরণ হিসাবে দেয় তার উল্লেখ করে।

পিএইচপি-র সমস্ত স্ট্রিংয়ের দৈর্ঘ্য যুক্ত থাকে, যা এটি রচনা করে এমন বাইটের সংখ্যা। যখন কোনও ফাংশন কোনও স্ট্রিংকে ম্যানিপুলেট করে, তা হয়:

  1. দৈর্ঘ্যের মেটা-ডেটা নির্ভর করে।
  2. স্ট্রিংটি নাল-টার্মিনেটেড হওয়ার উপর নির্ভর করুন, অর্থাত্ স্ট্রিংয়ের অংশটি রয়েছে এমন ডেটার পরে মান সহ একটি বাইট 0আসবে।

এটিও সত্য যে ইঞ্জিন দ্বারা চালিত সমস্ত স্ট্রিং পিএইচপি ভেরিয়েবলগুলিও নাল-সমাপ্ত হয়। ২ এর উপর নির্ভর করে এমন ফাংশনগুলির সমস্যাটি হ'ল, যদি স্ট্রিংটিতে মান সহ একটি বাইট থাকে 0তবে যে ফাংশনটি এটি পরিচালনা করে তা ভাববে স্ট্রিংটি সেই বিন্দুতে শেষ হয়ে গেছে এবং তারপরে সমস্ত কিছু উপেক্ষা করবে।

উদাহরণস্বরূপ, যদি পিএইচপি এর strlenফাংশন সি স্ট্যান্ডার্ড লাইব্রেরির মতো কাজ করে strlen, তবে ফলাফল এখানে ভুল হবে:

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

15
শেষ পর্যন্ত একটি উদাহরণ!
রাফায়েল

5
পিএইচপি 7.0 এ আমার পরীক্ষায়, স্ট্রেন () ফাংশনটি বাইনারি নিরাপদ ফাংশন।
লিনজি

@Artefacto: আপনি এই বলে যে বিল্ট-ইন পিএইচপি ফাংশন strlen()একটি হল বাইনারি-নিরাপদ ফাংশন আছে? আমি আপনার কাছ থেকে নিশ্চিত করছি পিএইচপি ম্যানুয়াল ফাংশন জন্য পৃষ্ঠা strlen()এটা কিনা এটি একটি যে উল্লিখিত না করে বাইনারি-নিরাপদ ফাংশান বা একটা অ বাইনারি নিরাপদ ফাংশন। পিএইচপি ম্যানুয়াল থেকে কেবল এটি হারিয়ে যাওয়া জিনিসটি আমার মনে বিভ্রান্তি তৈরি করছে তাই আমি আপনার কাছ থেকে এটি নিশ্চিত করতে চাই। আমি আগ্রহের সাথে আপনার উত্তরটির অপেক্ষায় রয়েছি ধন্যবাদ.
পিএইচপিএল ওভার

@ পিএইচপিএলওভার হ্যাঁ স্ট্রেলেন () বাইনারি নিরাপদ। চালানো php -r 'var_dump("\x00\x00\x00");'যাচাই করার জন্য, কিন্তু পিএইচপি এর strlen একটি জন্য বাইনারি নিরাপদ হয়েছে খুব , যেহেতু অন্তত পিএইচপি 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হেক্সাডেসিমাল স্বরলিপি নির্দেশ করে। দেখুন: পিএইচপি স্ট্রিং

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

এএসসিআইআই টেবিল এএসসিআইআই চর তালিকা দেখতে


কেবলমাত্র আমি বুঝতে পেরেছি তা নিশ্চিত করার জন্য, তাহলে ফাংশনটি বাইনারি নিরাপদ Hello\r\nWORLDমতো ঠিক হওয়া উচিত নয় , তাই না Hello?
চার্লি পার্কার

এছাড়াও, এই জাতীয় ফাংশন কীভাবে প্রয়োগ করা হয়? কোনও নিয়মিত অভিব্যক্তি যা এর বাইনারি নিরাপদ কিনা তা পরীক্ষা করে বা এটি কোনও অন্য পদ্ধতি ব্যবহার করে?
চার্লি পার্কার

@ সাবস্ক্রিবিয়াস: কার্যনির্মিতটি কি strlen() বাইনারি-নিরাপদ ?
পিএইচপিএনট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.