URL এ বেস 64 এনকোডযুক্ত স্ট্রিংগুলি পাস করা


243

জিইটি পরামিতিগুলির মাধ্যমে কাঁচা বেস 64 এনকোডযুক্ত স্ট্রিংগুলি পাস করা কি নিরাপদ?



4
না এটি নয় - লিঙ্কযুক্ত প্রশ্নটি নতুন। সুতরাং এটি সংযুক্ত প্রশ্ন একটির সদৃশ ... তোলে
সার্জ

উত্তর:


206

না, আপনাকে এটি ইউআরএল-এনকোডের দরকার হবে, যেহেতু বেস64 ings স্ট্রিংগুলিতে "+", "=" এবং "/" অক্ষর থাকতে পারে যা আপনার ডেটার অর্থ বদলে দিতে পারে - একটি সাব-ফোল্ডারের মতো দেখতে।

বৈধ বেস 64 অক্ষর নীচে রয়েছে।

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

4
ইউআরএলএনকোডিং হ'ল স্থানের অপচয়, বিশেষত বেস 64 যেমন অনেকগুলি অক্ষরকে অব্যবহৃত রাখে।
মিশা গার্নি

21
আমি নিশ্চিত না যে আপনি কী বলছেন তা আমি বুঝতে পেরেছি - ইউআরএল এনকোডিং উপরের তালিকার শেষ তিনটি অক্ষর ব্যতীত অন্য কোনও অক্ষরকে পরিবর্তন করতে পারবে না, এবং এটি ইউআরএলএসে অন্য অর্থ রয়েছে বলে তাদের ভুল ব্যাখ্যা থেকে আটকাতে হবে। বেস 64 এর জন্য একই হয়, মূল ডেটা বাইনারি বা যে কোনও কিছু হতে পারে তবে এটি এমন আকারে এনকোড করা থাকে যা সাধারণ প্রোটোকল ব্যবহার করে সহজেই প্রেরণ করা যায়।
থিয়াগরাজ

3
প্রথমত, আপনার '+' এড়াতে হবে কারণ এটি মহাশূন্যে রূপান্তরিত হতে পারে। দ্বিতীয়ত, কমপক্ষে কয়েকটি অক্ষর রয়েছে যা ইউআরএলগুলিতে ব্যবহারের জন্য নিরাপদ এবং 'স্ট্যান্ডার্ড' চরসেটে ব্যবহৃত হয় না। আপনার পদ্ধতি এমনকি নির্দিষ্ট পরিস্থিতিতে তিনবার স্থানান্তরিত ডেটার আকার বাড়াতে পারে ; সেই অক্ষরগুলির পরিবর্তে কিছু অন্যান্যর সাথে একই দৈর্ঘ্য সংরক্ষণের সময় কৌতুক হবে। এবং এটি বেশ স্ট্যান্ডার্ড সমাধানও।
মিশা গার্নি

8
en.wikedia.org/wiki/Base64# URL_applications - এটি স্পষ্টভাবে বলেছে যে পালিয়ে যাওয়া 'স্ট্রিংকে অহেতুক দীর্ঘায়িত করে' এবং বিকল্প চারসেট বৈকল্পিকের উল্লেখ করে।
মিশা গার্নি

1
এই উত্তরের কারণে, আমি আমার সমস্যাটিকে ঠিক যেমন উল্লিখিত হয়েছে তা নির্ণয় করলাম। ইউএসএল প্রক্রিয়াজাতকরণের কারণে কিছু বেস 64 টি অক্ষর (+, /, =) পরিবর্তন করা হচ্ছে। যখন আমি ইউআরএল বেস 64 স্ট্রিংটি এনকোড করেছি, তখন সমস্যাটি সমাধান হয়ে গেছে।
চক ক্রুটসিংগার

272

অতিরিক্ত বেস 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, '._-', '+/='));
}

53
কমা ব্যতীত দুর্দান্ত সমাধানটি ইউআরএলগুলিতে সংরক্ষিত নয়। আমি '~' (টিল্ড) বা '' ব্যবহার করার পরামর্শ দিচ্ছি। পরিবর্তে (বিন্দু)
kralyk

11
@ ক্র্লাইক: রড্রিগো-সিলভিরার উত্তর অনুসারে আমি ঠিক সেইভাবে ব্যবহার করে ফিরে এসেছি urlencode। ইউআরএল দৈর্ঘ্যের কয়েকটি অক্ষর সংরক্ষণ করতে দুটি নতুন ফাংশন তৈরি করা, এটি কেবল দরজা ব্যবহারের পরিবর্তে আপনার ঘরে প্রবেশ করার মতো উইন্ডো দিয়ে প্রবেশ করার মতো।
মার্কো ডেমাইও

5
@ মার্কোডেমিও, এটি কীভাবে ব্যবহার করা হবে তা না জেনে এটি কেবল কয়েকটি চরিত্রের পক্ষে বলা অসম্ভব। প্রতিটি এনকোডযুক্ত চরিত্রের দৈর্ঘ্য তিনগুণ হবে এবং কেন "+++ ..." একটি বৈধ বেস 64 স্ট্রিং হবে না? ইউআরএলগুলির ব্রাউজারের সীমা রয়েছে এবং একটি URL ট্রিপল করা আপনাকে সেই সীমাগুলিতে আঘাত করতে পারে।
লিউজ

10
@RandalSchwartz টিল্ড হয় URL টি-নিরাপদ। আরএফসি 3986 থেকে:unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
ক্রেলিক

3
যেহেতু ,করতে urlencoded হবে %2C, আমি ব্যবহার করার পরামর্শ দিই ._- পরিবর্তে -_,একমাত্র বৈকল্পিক মত en.wikipedia.org/wiki/Base64#Variants_summary_table যে trailing রাখে =
PaulH

75

@ জোয়েশমো বা কোনও সহায়ক ফাংশন লেখার পরিবর্তে আপনি কেবল বেস 64 এনকোড স্ট্রিংটি ইউলিনকোড করতে পারেন। এটি আপনার সহায়ক ফাংশন হিসাবে ঠিক একই জিনিসটি করবে তবে দুটি অতিরিক্ত ফাংশনের প্রয়োজন ছাড়াই।

$str = 'Some String';

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );

2
ফলাফল হুবহু এক নয়। ইউরেনকোডে অ-বৈধ অক্ষরগুলি এনকোড করতে 3 টি অক্ষর ব্যবহার করা হয় এবং জোয়েশমোর সমাধানটি 1 ব্যবহার করে It's এটি কোনও বড় পার্থক্য নয়, তবে এটি এখনও অপচয়।
জোসেফ বোর্কোভেক

1
@ জোসেফ বারকোভেক সত্যই? তারপরে এর অর্থ একই সংখ্যক বাইট বেস 64-> url-> এনকোডযুক্ত বিভিন্ন ফলাফলের দৈর্ঘ্যের বিভিন্ন হতে পারে, অন্য সমাধানটি অনুমানযোগ্য দৈর্ঘ্য দেয়, তাই না?
humanityANDpeace

@ হিউম্যানিটিএন্ডপিস হ্যাঁ, ইউরেনকোড একটি বিষ্ঠা সমাধান কারণ এটি কয়েকটি বেস 64 স্ট্রিংয়ের আকারকে তিনগুণ করে। ইনপুট চেয়ে আউটপুট বড় হওয়ায় আপনি বাফারটি পুনরায় ব্যবহার করতে পারবেন না।
নবীন

4
1 থেকে 3 অক্ষরের বিস্তৃতি গড়ে 64 টির মধ্যে 3 টির উপরে ঘটে, সুতরাং এটি 9% ওভারহেড (2 *
3/64

/চরিত্রটি সম্পর্কে সতর্কতা অবলম্বন করুন যদি আপনি এটি জিইটি প্যারামিটার হিসাবে না, তবে ইউআরএলটিতে একটি পথ হিসাবে পাস করেন। আপনি /উভয় পক্ষের অন্য কিছু দিয়ে প্রতিস্থাপন না করলে এটি আপনার পথ পরিবর্তন করবে change
নেভারইন্ডিংকিউ

41

পরিচিতি দ্রষ্টব্য আমি কয়েকটি স্পষ্টতা পোস্ট করতে চাইছি যেহেতু এখানে কয়েকটি উত্তর কিছুটা বিভ্রান্তিকর ছিল (যদি ভুল না হয়)।

উত্তরটি হ'ল না , আপনি কোনও ইউআরএল কোয়েরি স্ট্রিংয়ের মধ্যে কেবল বেস 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(), তবে এটি অনর্থক এবং অতএব অপ্রয়োজনীয় হবে।


1
চমৎকার উত্তর. যদি প্রশ্ন ছাগু ট্যাগ করা হয় এই সাইটে শুরু এবং শেষ ট্যাগ ছাড়া পিএইচপি কোড ব্যবহার করতে পারেন পিএইচপি (এছাড়াও প্রায়শই এটা প্রশ্নই প্রসঙ্গ থেকে পরিষ্কার)। আপনি যদি একটি লাইনের শেষে দুটি স্পেস যুক্ত করেন তবে আপনি দেখতে পাবেন <br>, সুতরাং খুব বেশি এইচটিএমএল টাইপ করার দরকার নেই। আমি আশা করি এটি সাহায্য করে, আমি আপনার উত্তরটিকে আরও উন্নত করতে কিছুটা সম্পাদনা করেছি।
hakre

আপনার জন্য পিএইচপি ইউআরএল ডিকোড করার জন্য আপনাকে ধন্যবাদ। এটি আমাকে খরগোশের গর্তের মধ্যে পড়ার হাত থেকে বাঁচায়।
কোরেস্ট

দুর্দান্ত উত্তর -> আপনি urldecode করতে চান না () ফেরত $ _GET স্ট্রিং + এর হিসাবে স্পেসে রূপান্তরিত হবে। এটি তবে
কাঁচাবার্ডিকোড

14

হ্যা এবং না.

বেস 64 এর বেসিক চরসেটটি কিছু ক্ষেত্রে ইউআরএলগুলিতে ব্যবহৃত traditionalতিহ্যবাহী কনভেনশনগুলির সাথে সংঘর্ষে লিপ্ত হতে পারে। তবে বেস 64 এর অনেকগুলি বাস্তবায়ন আপনাকে URL গুলি আরও ভালভাবে মেলাতে চরসেট পরিবর্তন করতে দেয় বা একটি (পাইথনের মতো urlsafe_b64encode()) এনে দেয় ।

আপনি যে আর একটি সমস্যার মুখোমুখি হতে পারেন তা হ'ল ইউআরএল দৈর্ঘ্যের সীমাবদ্ধতা - এর সীমাবদ্ধতার অভাব। মানকগুলি কোনও সর্বাধিক দৈর্ঘ্য নির্দিষ্ট করে না বলে, ব্রাউজারগুলি, সার্ভারগুলি, লাইব্রেরি এবং এইচটিটিপি প্রোটোকলের সাথে কাজ করা অন্যান্য সফ্টওয়্যার তার নিজস্ব সীমাটি নির্ধারণ করতে পারে। আপনি এই নিবন্ধটি একবার দেখে নিতে পারেন: ডাব্লুডাব্লুডাব্লিউএফএইউ: একটি ইউআরএল সর্বোচ্চ দৈর্ঘ্য কত?


8

এটি একটি বেস 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));
}

এটি জাভাBase64.getUrlEncoder().withoutPadding().encodeToString()

4

আমি মনে করি না এটি নিরাপদ কারণ উদাহরণস্বরূপ "=" অক্ষরটি কাঁচা বেস 64 এ ব্যবহৃত হয় এবং এটি এইচটিটিপি জিইটি-র মান থেকে পরামিতিগুলি পৃথক করতেও ব্যবহৃত হয়।


1

তত্ত্বের ক্ষেত্রে, হ্যাঁ, যতক্ষণ না আপনি ক্লায়েন্ট বা সার্ভারের জন্য সর্বাধিক url এবং / oor ক্যোয়ারী স্ট্রিংয়ের দৈর্ঘ্য অতিক্রম করবেন না।

অনুশীলনে, জিনিসগুলি কিছুটা কৌশলযুক্ত হতে পারে। উদাহরণস্বরূপ, মানটি যদি "অন" থাকে এবং আপনি "==" এ চলে যান তবে এটি ASP.NET- এ একটি HTTPRequestValidationException ট্রিগার করতে পারে।


আপনি +, /, বা = অক্ষরের কোনও উল্লেখ করেন না যা নির্দিষ্ট ক্ষেত্রে ইউআরএলকে অবৈধ করে তোলে।
উইল বিকফোর্ড

0

Url নিরাপদ এনকোডের জন্য, base64.urlsafe_b64encode(...)পাইথনের মতো নীচের কোডটিও আমার সাথে 100% কাজ করে

function base64UrlSafeEncode(string $input)
{
   return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}

-10

হ্যাঁ, এটি সর্বদা নিরাপদ। অবশ্যই বেস 64 রয়েছে: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= তবে একটি বেস 64 এনকোড স্ট্রিংয়ে সাধারণত কোনও থাকে না ++একটি ফাঁকা জায়গায় রূপান্তরিত হবে, ভুল ডিকোডড স্ট্রিংয়ের ফলাফল। /একটি পরামিতি জোড়া পেতে নিরাপদ। =বেস64 এনকোডড স্ট্রিংয়ের শেষে সর্বদা থাকে এবং সার্ভার দিকটি =সরাসরি সমাধান করতে পারে ।


আমি অনুমান করছি এটি সঠিক, আমি বেস 64৪ টি এনকোডিং (ইউআরএল এনকোডিং ছাড়াই) দিয়ে যে পরীক্ষাগুলি সফল করেছি তা সফল হয়েছে, তবে আমি ভাবছি যে এটির কোনও ব্যাক আপ সরবরাহ করতে পারে এমন কোনও ডকুমেন্টেশন আছে কিনা?
শিন দ্য বিন

1
আপনি "সর্বদা নিরাপদ" বলে থাকেন তবে আপনি "সাধারণত কোনও + থাকে না" বলে থাকেন। সুতরাং আপনার নিজেকে বিবাদী। আপনার বেস 64 স্ট্রিংটিতে এটি না থাকলে + সাইন seams সমস্যার কারণ হতে পারে।
নিক হিউরিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.