জিইটি পরামিতিগুলির মাধ্যমে কাঁচা বেস 64 এনকোডযুক্ত স্ট্রিংগুলি পাস করা কি নিরাপদ?
জিইটি পরামিতিগুলির মাধ্যমে কাঁচা বেস 64 এনকোডযুক্ত স্ট্রিংগুলি পাস করা কি নিরাপদ?
উত্তর:
না, আপনাকে এটি ইউআরএল-এনকোডের দরকার হবে, যেহেতু বেস64 ings স্ট্রিংগুলিতে "+", "=" এবং "/" অক্ষর থাকতে পারে যা আপনার ডেটার অর্থ বদলে দিতে পারে - একটি সাব-ফোল্ডারের মতো দেখতে।
বৈধ বেস 64 অক্ষর নীচে রয়েছে।
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
অতিরিক্ত বেস 64 চশমা রয়েছে। ( সুনির্দিষ্ট জন্য এখানে টেবিল দেখুন )। তবে মূলত এনকোড করতে আপনার 65 টি অক্ষর প্রয়োজন: 26 ছোট ছোট + 26 বড় হাতের অক্ষর + 10 অঙ্ক = 62।
আপনার আরও দুটি ['+', '/'] এবং একটি প্যাডিং চর '=' দরকার। তবে এগুলির কোনওটিই ইউআরএল বান্ধব নয়, তাই কেবল তাদের জন্য আলাদা আলাদা অক্ষর ব্যবহার করুন এবং আপনি সেট হয়ে গেছেন। উপরের চার্টের স্ট্যান্ডার্ডগুলি হ'ল ['-', '_'], তবে আপনি যতক্ষণ না তাদের চরিত্রগুলি একইভাবে ডিকোড করেছেন ততক্ষণ আপনি অন্য চরিত্রগুলি ব্যবহার করতে পারতেন এবং অন্যদের সাথে ভাগ করে নেওয়ার প্রয়োজন পড়েনি।
আমি কেবল নিজের সাহায্যকারীদের লেখার পরামর্শ দেব। বেস 64 enেনকোডের জন্য পিএইচপি ম্যানুয়াল পৃষ্ঠাতে মন্তব্যগুলি থেকে এগুলি পছন্দ করুন :
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '._-');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '._-', '+/='));
}
urlencode
। ইউআরএল দৈর্ঘ্যের কয়েকটি অক্ষর সংরক্ষণ করতে দুটি নতুন ফাংশন তৈরি করা, এটি কেবল দরজা ব্যবহারের পরিবর্তে আপনার ঘরে প্রবেশ করার মতো উইন্ডো দিয়ে প্রবেশ করার মতো।
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
,
করতে urlencoded হবে %2C
, আমি ব্যবহার করার পরামর্শ দিই ._-
পরিবর্তে -_,
একমাত্র বৈকল্পিক মত en.wikipedia.org/wiki/Base64#Variants_summary_table যে trailing রাখে =
@ জোয়েশমো বা কোনও সহায়ক ফাংশন লেখার পরিবর্তে আপনি কেবল বেস 64 এনকোড স্ট্রিংটি ইউলিনকোড করতে পারেন। এটি আপনার সহায়ক ফাংশন হিসাবে ঠিক একই জিনিসটি করবে তবে দুটি অতিরিক্ত ফাংশনের প্রয়োজন ছাড়াই।
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
/
চরিত্রটি সম্পর্কে সতর্কতা অবলম্বন করুন যদি আপনি এটি জিইটি প্যারামিটার হিসাবে না, তবে ইউআরএলটিতে একটি পথ হিসাবে পাস করেন। আপনি /
উভয় পক্ষের অন্য কিছু দিয়ে প্রতিস্থাপন না করলে এটি আপনার পথ পরিবর্তন করবে change
পরিচিতি দ্রষ্টব্য আমি কয়েকটি স্পষ্টতা পোস্ট করতে চাইছি যেহেতু এখানে কয়েকটি উত্তর কিছুটা বিভ্রান্তিকর ছিল (যদি ভুল না হয়)।
উত্তরটি হ'ল না , আপনি কোনও ইউআরএল কোয়েরি স্ট্রিংয়ের মধ্যে কেবল বেস 64 এনকোডড প্যারামিটারটি পাস করতে পারবেন না কারণ signs _GET গ্লোবাল অ্যারের অভ্যন্তরে প্লাস চিহ্নগুলি একটি স্প্যাসে রূপান্তরিত হয়। অন্য কথায়, আপনার পাঠানো যদি test.php? MyVar = stringwith + চিহ্নটিতে করতে
//test.php
print $_GET['myVar'];
ফলাফলটি হবে:
stringwith sign
urlencode()
এটির সমাধানের সহজ উপায় হ'ল +, =, এবং / অক্ষরগুলি% ## কোডগুলিতে পালাতে ক্যোয়ারী স্ট্রিংয়ে এটি যুক্ত করার আগে কেবল আপনার বেস64 স্ট্রিংটি। উদাহরণস্বরূপ, urlencode("stringwith+sign")
রিটার্নstringwith%2Bsign
আপনি অ্যাকশনটি প্রক্রিয়া করার সময়, পিএইচপি কোয়েরি স্ট্রিংটি স্বয়ংক্রিয়ভাবে ডিকোড করার যত্ন নেয় it _GET বিশ্বব্যাপী ulates উদাহরণস্বরূপ, যদি আমাকে পাঠানো test.php? MyVar = stringwith% 2Bsign করতে
//test.php
print $_GET['myVar'];
ফলাফলটি হ'ল:
stringwith+sign
আপনি ফিরে আসা G _GET স্ট্রিংটিতে চান নাurldecode()
কারণ + এর স্পেসে রূপান্তরিত হবে।
অন্য কথায় যদি আমি একই টেস্টটি পাঠিয়ে থাকি তবে। Php? MyVar = স্ট্রিংয়ের সাথে% 2B এ সাইন ইন করুন
//test.php
$string = urldecode($_GET['myVar']);
print $string;
ফলাফল একটি অপ্রত্যাশিত:
stringwith sign
এটি ইনপুটটিতে নিরাপদ হবে rawurldecode()
, তবে এটি অনর্থক এবং অতএব অপ্রয়োজনীয় হবে।
<br>
, সুতরাং খুব বেশি এইচটিএমএল টাইপ করার দরকার নেই। আমি আশা করি এটি সাহায্য করে, আমি আপনার উত্তরটিকে আরও উন্নত করতে কিছুটা সম্পাদনা করেছি।
হ্যা এবং না.
বেস 64 এর বেসিক চরসেটটি কিছু ক্ষেত্রে ইউআরএলগুলিতে ব্যবহৃত traditionalতিহ্যবাহী কনভেনশনগুলির সাথে সংঘর্ষে লিপ্ত হতে পারে। তবে বেস 64 এর অনেকগুলি বাস্তবায়ন আপনাকে URL গুলি আরও ভালভাবে মেলাতে চরসেট পরিবর্তন করতে দেয় বা একটি (পাইথনের মতো urlsafe_b64encode()
) এনে দেয় ।
আপনি যে আর একটি সমস্যার মুখোমুখি হতে পারেন তা হ'ল ইউআরএল দৈর্ঘ্যের সীমাবদ্ধতা - এর সীমাবদ্ধতার অভাব। মানকগুলি কোনও সর্বাধিক দৈর্ঘ্য নির্দিষ্ট করে না বলে, ব্রাউজারগুলি, সার্ভারগুলি, লাইব্রেরি এবং এইচটিটিপি প্রোটোকলের সাথে কাজ করা অন্যান্য সফ্টওয়্যার তার নিজস্ব সীমাটি নির্ধারণ করতে পারে। আপনি এই নিবন্ধটি একবার দেখে নিতে পারেন: ডাব্লুডাব্লুডাব্লিউএফএইউ: একটি ইউআরএল সর্বোচ্চ দৈর্ঘ্য কত?
এটি একটি বেস 64url এনকোড যা আপনি চেষ্টা করতে পারেন, এটি উপরে জোশমোর কোডটির কেবলমাত্র বর্ধন।
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
তত্ত্বের ক্ষেত্রে, হ্যাঁ, যতক্ষণ না আপনি ক্লায়েন্ট বা সার্ভারের জন্য সর্বাধিক url এবং / oor ক্যোয়ারী স্ট্রিংয়ের দৈর্ঘ্য অতিক্রম করবেন না।
অনুশীলনে, জিনিসগুলি কিছুটা কৌশলযুক্ত হতে পারে। উদাহরণস্বরূপ, মানটি যদি "অন" থাকে এবং আপনি "==" এ চলে যান তবে এটি ASP.NET- এ একটি HTTPRequestValidationException ট্রিগার করতে পারে।
Url নিরাপদ এনকোডের জন্য, base64.urlsafe_b64encode(...)
পাইথনের মতো নীচের কোডটিও আমার সাথে 100% কাজ করে
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
হ্যাঁ, এটি সর্বদা নিরাপদ। অবশ্যই বেস 64 রয়েছে:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
তবে একটি বেস 64 এনকোড স্ট্রিংয়ে সাধারণত কোনও থাকে না +
। +
একটি ফাঁকা জায়গায় রূপান্তরিত হবে, ভুল ডিকোডড স্ট্রিংয়ের ফলাফল। /
একটি পরামিতি জোড়া পেতে নিরাপদ। =
বেস64 এনকোডড স্ট্রিংয়ের শেষে সর্বদা থাকে এবং সার্ভার দিকটি =
সরাসরি সমাধান করতে পারে ।