উত্তর:
এই এক চটপটি:
আপনি মনে হতে পারে এটি হওয়া উচিত, কিন্তু সত্যিই এটি মোটেও নয়!
কুকির নাম এবং মান উভয়টিতে অনুমোদিত অক্ষরগুলি কী কী?
প্রাচীন নেটস্কেপ কুকি_স্পেক অনুসারে পুরো NAME=VALUE
স্ট্রিংটি হ'ল:
আধা-কোলন, কমা এবং সাদা স্থান বাদ দিয়ে অক্ষরের একটি ক্রম।
তাই -
কাজ করা উচিত, এবং এটি ঠিক আছে ব্রাউজারে আমি এখানে পেয়েছেন হবে বলে মনে হচ্ছে না; আপনি এটি নিয়ে কোথায় সমস্যা করছেন?
উপরোক্ত জড়িত দ্বারা:
=
অন্তর্ভুক্ত আইনী, কিন্তু সম্ভাব্য অস্পষ্ট। ব্রাউজারগুলি সর্বদা =
স্ট্রিংয়ের প্রথম চিহ্নটিতে নাম এবং মানকে বিভক্ত করে , তাই অনুশীলনে আপনি ভ্যালুতে একটি =
চিহ্ন রাখতে পারেন তবে NAME নয়।যা উল্লেখ করা হয়নি, কারণ নেটস্কেপ লেখার চশমাটি ভয়ানক ছিল, তবে ব্রাউজারগুলির দ্বারা এটি ধারাবাহিকভাবে সমর্থিত বলে মনে হয়:
NAME বা VALUE হয় ফাঁকা স্ট্রিং
যদি =
স্ট্রিংটিতে কোনও চিহ্নই না থাকে, ব্রাউজারগুলি এটিকে খালি স্ট্রিং নাম সহ কুকি হিসাবে বিবেচনা করে, যেমনটি Set-Cookie: foo
একই Set-Cookie: =foo
।
যখন ব্রাউজারগুলি খালি নামের কোনও কুকিকে আউটপুট দেয়, তারা সমান চিহ্নটি বাদ দেয়। তাই Set-Cookie: =bar
জন্ম Cookie: bar
।
নাম এবং মানগুলিতে কমা এবং স্পেসগুলি বাস্তবে কাজ করে বলে মনে হয়, যদিও সমান চিহ্নের চারপাশে ফাঁকা স্থান ছাঁটাই করা হয়
(নিয়ন্ত্রণ অক্ষর \x00
থেকে \x1F
প্লাস \x7F
) অনুমতি দেওয়া হয় না
যা উল্লিখিত হয়নি এবং ব্রাউজারগুলি সম্পূর্ণরূপে অসঙ্গত, এটি নন-এএসসিআইআই (ইউনিকোড) অক্ষর:
সুতরাং অনুশীলনে আপনি কুকিগুলিতে অ-ASCII অক্ষরগুলি মোটেই ব্যবহার করতে পারবেন না। আপনি যদি ইউনিকোড, নিয়ন্ত্রণ কোড বা অন্যান্য স্বেচ্ছাসেবী বাইট ক্রম ব্যবহার করতে চান তবে কুকি_স্পেক আপনার নিজের পছন্দসই একটি অ্যাড-হক এনকোডিং স্কিম ব্যবহার করার এবং ইউআরএল-এনকোডিং (জাভাস্ক্রিপ্ট দ্বারা উত্পাদিত encodeURIComponent
) হিসাবে যুক্তিসঙ্গত পছন্দ হিসাবে পরামর্শ দেওয়ার দাবি করে।
নিরিখে প্রকৃত মান, সেখানে সারসংগ্রহ করা কুকি আচরণ করতে কয়েক প্রচেষ্টা হয়েছে কিন্তু কেউই এ পর্যন্ত আসলে বাস্তব জগতে প্রতিফলিত করে।
আরএফসি 2109 মূল নেটস্কেপ কুকি_স্পেক কোডিং এবং ঠিক করার চেষ্টা ছিল an এই স্ট্যান্ডার্ডে আরও অনেকগুলি বিশেষ অক্ষরকে অনুমোদিত নয়, কারণ এটি আরএফসি 2616 টোকেন ব্যবহার করে ( -
এটিকে এখনও সেখানে অনুমোদিত) এবং অন্যান্য মানগুলির সাথে কেবল একটি মানকে উদ্ধৃত স্ট্রিংয়ে নির্দিষ্ট করা যেতে পারে। কোনও ব্রাউজার কখনও সীমাবদ্ধতা, উদ্ধৃত স্ট্রিং এবং পালানোর বিশেষ হ্যান্ডলিং বা এই বৈশিষ্ট্যে থাকা নতুন বৈশিষ্ট্যগুলি কার্যকর করে না।
আরএফসি 2965 এর আরেকটি পদক্ষেপ ছিল, 2109 সাফ করে এবং একটি 'সংস্করণ 2 কুকিজ' প্রকল্পের অধীনে আরও বৈশিষ্ট্য যুক্ত করে। কেউ কখনও এর কোনও প্রয়োগও করেনি। এই অনুচ্ছেদে পূর্ববর্তী সংস্করণ হিসাবে একই টোকেন এবং উদ্ধৃত-স্ট্রিং সীমাবদ্ধতা রয়েছে এবং এটি ঠিক বোকা বোঝা।
আরএফসি 6265 HTML তিহাসিক জগাখিচুড়ি পরিষ্কার করার জন্য একটি HTML5-যুগের প্রচেষ্টা। এটি এখনও বাস্তবের সাথে ঠিক মেলে না তবে এটি পূর্বের প্রচেষ্টাগুলির চেয়ে অনেক ভাল — এটি ব্রাউজারগুলি কী সমর্থন করে তার কোনও সিনট্যাক্স প্রবর্তন করে না তবে এটি অন্তত একটি উপযুক্ত উপসেট (পূর্ববর্তী উদ্ধৃত স্ট্রিংয়ের মতো) ।
6265-এ কুকির নামটি এখনও একটি আরএফসি 2616 হিসাবে নির্দিষ্ট করা হয়েছে token
যার অর্থ আপনি আলফানামগুলি থেকে বেছে নিতে পারেন:
!#$%&'*+-.^_`|~
কুকি মানতে এটি আনুষ্ঠানিকভাবে (ব্রাউজারগুলি দ্বারা ছাঁকানো) নিয়ন্ত্রণ অক্ষর এবং (অসম্পূর্ণভাবে প্রয়োগ করা) নন-এসসিআইআই অক্ষরকে নিষিদ্ধ ঘোষণা করে। এটি স্পেস, কমা এবং সেমিকোলনে কুকি_স্পেকের নিষেধাজ্ঞাকে বজায় রেখেছে, এবং পূর্ববর্তী আরএফসি বাস্তবায়িত যে কোনও দরিদ্র বুদ্ধিমানের সাথে সামঞ্জস্যের জন্য এটি পুরো মান মোড়ানো কোটস ব্যতীত ব্যাকস্ল্যাশ এবং কোট নিষিদ্ধ করেছে (তবে সেই ক্ষেত্রে উদ্ধৃতিগুলি এখনও অংশ হিসাবে বিবেচিত হয়) মান, কোনও এনকোডিং স্কিম নয়)। যাতে আপনাকে আলফানামগুলি যোগ করে দেয়:
!#$%&'()*+-./:<=>?@[]^_`{|}~
বাস্তব বিশ্বে আমরা এখনও মূল-সবচেয়ে খারাপ নেটস্কেপ কুকি_স্পেক ব্যবহার করছি, সুতরাং কুকিজ গ্রাহক কোডগুলি বেশ কিছু কিছুর মুখোমুখি হওয়ার জন্য প্রস্তুত থাকতে হবে, তবে কুকিজ তৈরির কোডের জন্য আরএফসি 6265 এর সাবসেটের সাথে লেগে থাকার পরামর্শ দেওয়া হয়।
Name="Va;lue"; max-age...
। এটি ব্রাউজারগুলিতে কাজ করে না এবং এটি আরএফসি 6265 তে অনুমোদিত নয়, যা 2965 প্রতিস্থাপন করার প্রস্তাব দেওয়া হয়েছে এবং বাস্তবতাকে আরও ভালভাবে প্রতিফলিত করার চেষ্টা করে।
1*<any CHAR except CTLs or separators>
এবং বিভাজক হয় (
, )
, <
, >
, @
, ,
, ;
, :
, \
, "
, /
, [
, ]
, ?
, =
, {
, }
, SP
এবং HT
, তাই কুকি নাম alphanums হওয়া উচিত প্লাস!#$%&'*+-.?^_`|~
এএসপি.নেটে আপনি System.Web.HttpUtility
কুকিকে লেখার আগে কুকির মানটি নিরাপদে এনকোড করতে ব্যবহার করতে পারেন এবং এটি পড়ার পরে এটিকে তার মূল ফর্মটিতে আবার রূপান্তর করতে পারেন।
// Encode
HttpUtility.UrlEncode(cookieData);
// Decode
HttpUtility.UrlDecode(encodedCookieData);
এটি অ্যাম্পারস্যান্ডগুলি বন্ধ করে দেবে এবং কোনও কুকিতে লিখিত হওয়ার সাথে সাথে একটি মান / নাম জোড়ের গোছায় বিভক্ত চিহ্নের সমান হয়।
আমি মনে করি এটি সাধারণত ব্রাউজার নির্দিষ্ট। নিরাপদ দিকে থাকতে, বেস 64 একটি জেএসওএন অবজেক্টকে এনকোড করে এবং এতে সমস্ত কিছু সঞ্চয় করে। এইভাবে আপনাকে কেবল এটি ডিকোড করতে হবে এবং জেএসএনকে বিশ্লেষণ করতে হবে। বেস 64 এ ব্যবহৃত সমস্ত অক্ষর বেশিরভাগের সাথে দুর্দান্তভাবে খেলতে হবে, যদি সমস্ত ব্রাউজার না হয়।
এখানে এটি যতটা সম্ভব কথায় কথায় বলা যায় । যে অক্ষরগুলির পালানোর দরকার নেই সেগুলিতে মনোনিবেশ করুন:
কুকিজের জন্য:
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!#$%&'()*+-./:<>?@[]^_`{|}~
ইউআরএল জন্য
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789.-_~!$&'()*+,;=:@
কুকিজ এবং url (ছেদ) জন্য
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!$&'()*+-.:@_~
এইভাবে আপনি উত্তর।
নোট করুন যে কুকিজের জন্য, = কে মুছে ফেলা হয়েছে কারণ এটি সাধারণত কুকির মান সেট করতে ব্যবহৃত হয়।
ইউআরএলগুলির জন্য এটি = রাখা হয়েছিল। ছেদটি স্পষ্টতই ছাড়াই।
var chars = "abdefghijklmnqrstuvxyz"; chars += chars.toUpperCase() + "0123456789" + "!$&'()*+-.:@_~";
ঘটনাক্রমে এবং অপ্রত্যাশিতভাবে ঘটতে থাকে, বিশেষত জাভা কুকি পরিবেশে যেখানে কুকি শেষ অক্ষরগুলির মুখোমুখি হয় তার সাথে ডাবল উদ্ধৃতি দিয়ে মুড়িয়ে দেওয়া থেকে পালিয়ে যায়।
তাই নিরাপদে থাকার জন্য, কেবল A-Za-z1-9 ব্যবহার করুন। আমি কি করতে যাচ্ছি।
নতুন আরএফসি 6265 এপ্রিল 2011 এ প্রকাশিত:
cookie-header = "Cookie:" OWS cookie-string OWS
cookie-string = cookie-pair *( ";" SP cookie-pair )
cookie-pair = cookie-name "=" cookie-value
cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
; US-ASCII characters excluding CTLs,
; whitespace DQUOTE, comma, semicolon,
; and backslash
আপনি যদি @ ববিস উত্তরের দিকে সন্ধান করেন তবে দেখতে পাবেন যে আরও নতুন বিধিনিষেধগুলি আরও কঠোর।
কুকিজের স্পেসিফিকেশনের 2 সংস্করণ রয়েছে
1. সংস্করণ 0 কুকিজ ওরফে নেটস্কেপ কুকিজ,
2. সংস্করণ 1 ওরফে আরএফসি 2965 কুকিজ
সংস্করণ 0 কুকিগুলির নাম এবং মান অংশটি সেমিকোলন, কমা, সমান চিহ্ন এবং হোয়াইটস্পেস ব্যতীত অক্ষরের অনুক্রম are যদি উদ্ধৃতি চিহ্ন ব্যবহার করেন নি
সংস্করণ 1 আরো অনেক জটিল আপনি এটি পরীক্ষা করতে পারেন এখানে
নাম মান অংশ জন্য এই সংস্করণে চশমা নাম ছাড়া প্রায় একই $ চিহ্ন দিয়ে শুরু হতে পারে
আইই এবং এজ নিয়ে আরও একটি আকর্ষণীয় সমস্যা রয়েছে। যে কুকিগুলির 1 টিরও বেশি পিরিয়ডের নাম রয়েছে তারা নিঃশব্দে বাদ পড়েছে বলে মনে হচ্ছে। সুতরাং এটি কাজ করে:
cookie_name_a = valuea
যদিও এটি বাদ পড়বে
cookie.name.a = valuea
এটি সহজ:
কন্ট্রোল অক্ষর (সিটিএল), স্পেসস বা ট্যাবগুলি ব্যতীত <কুকি-নাম> যে কোনও মার্কিন-এএসসিআইআই অক্ষর হতে পারে। এটিতে নিম্নলিখিতগুলির মতো পৃথককারী চরিত্রও থাকতে হবে না: () <> @,; : \ "/ []? = {}।
একটি <কুকি-ভ্যালু> allyচ্ছিকভাবে ডাবল উদ্ধৃতিতে সেট করা যেতে পারে এবং সিটিএল, সাদা স্থান, ডাবল কোটস, কমা, সেমিকোলন এবং ব্যাকস্ল্যাশ ব্যতীত যে কোনও মার্কিন-এএসসিআইআই অক্ষর অনুমোদিত। এনকোডিং: অনেকগুলি বাস্তবায়ন কুকি মানগুলিতে ইউআরএল এনকোডিং সম্পাদন করে, তবে এটি আরএফসি স্পেসিফিকেশন অনুযায়ী প্রয়োজন হয় না। এটি কোন চরিত্রের জন্য অনুমোদিত তা সম্পর্কে প্রয়োজনীয়তাগুলি পূরণ করতে সহায়তা করে।
লিঙ্ক: https://developer.mozilla.org/en-US/docs/Web/HTTP/Heeda/Set-Cookie# নির্দেশিকা
আরও একটি বিবেচনা। আমি সম্প্রতি একটি স্কিম বাস্তবায়িত করেছি যেখানে পিএইচপি স্ক্রিপ্টে কিছু সংবেদনশীল তথ্য পোস্ট করা হয়েছে যা এটিকে একটি এনক্রিপ্ট করা কুকি হিসাবে রূপান্তর করতে এবং ফিরিয়ে দিতে হবে, যা আমার মনে হয়েছিল যে সমস্ত বেস 64 মানগুলি 'নিরাপদ "গ্যারান্টিযুক্ত ছিল। সুতরাং আমি কর্তব্যবোধে আরসি 4 ব্যবহার করে ডেটা আইটেমগুলি এনক্রিপ্ট করেছিলাম বেস 6464_মেনকোডের মাধ্যমে আউটপুট, এবং আনন্দের সাথে কুকিটি সাইটে ফিরে আসল। বেস 64 এর এনকোডযুক্ত স্ট্রিংটিতে "+" চিহ্ন উপস্থিত না হওয়া অবধি টেস্টিং ভাল চলছে বলে মনে হয়েছে The স্ট্রিংটি কোনও সমস্যা ছাড়াই পৃষ্ঠা কুকিতে লেখা ছিল the ব্রাউজার ডায়াগনস্টিক ব্যবহার করে আমিও পারতাম কুকিগুলি অপরিবর্তিত ছিল কিনা তা যাচাই করুন Then তারপরে যখন পরবর্তী পৃষ্ঠায় আমার পিএইচপি বলা হয়েছিল এবং $ _COOKIE অ্যারের মাধ্যমে কুকিটি পেয়েছিলেন তখন স্ট্রিংটিতে "+" চিহ্নটি অনুপস্থিত খুঁজে পেয়ে আমি স্তম্ভিত হয়ে গিয়েছিলাম। সেই অক্ষরের প্রতিটি উপস্থিতি একটি প্রতিস্থাপনের সাথে প্রতিস্থাপন করা হয়েছিল এএসসিআইআই স্পেস।
তখন থেকে আমি এই দৃশ্যের বর্ণনা দিতে গিয়ে কতগুলি অনুরূপ অমীমাংসিত অভিযোগ পড়েছি তা বিবেচনা করে, প্রায়শই বেস 64 ব্যবহার করে "নিরাপদে" কুকিগুলিতে স্বেচ্ছাসেবীর তথ্য সংরক্ষণ করার জন্য অসংখ্য রেফারেন্স লিখেছি, আমি ভেবেছিলাম যে আমি সমস্যাটি চিহ্নিত করব এবং আমার স্বীকারোক্তিযুক্ত ক্লডজি সমাধানটি উপস্থাপন করব।
আপনি কোনও টুকরো ডাটাতে যা যা করতে চান এনক্রিপশন করার পরে, এবং তারপরে "64 কুকি-সুরক্ষিত" করতে বেস 64_encode ব্যবহার করে এর মাধ্যমে আউটপুট স্ট্রিং চালান ...
// from browser to PHP. substitute troublesome chars with
// other cookie safe chars, or vis-versa.
function fix64($inp) {
$out =$inp;
for($i = 0; $i < strlen($inp); $i++) {
$c = $inp[$i];
switch ($c) {
case '+': $c = '*'; break; // definitly won't transfer!
case '*': $c = '+'; break;
case '=': $c = ':'; break; // = symbol seems like a bad idea
case ':': $c = '='; break;
default: continue;
}
$out[$i] = $c;
}
return $out;
}
এখানে আমি কুকি হিসাবে ব্যবহারের জন্য পৃষ্ঠায় এনকোডযুক্ত মানটি ফেরত দেওয়ার আগে অন্যান্য "কুকি নিরাপদ" অক্ষরগুলির সাথে কেবল "+" (এবং ঠিক করেছি "=" স্থির করে রেখেছি)। নোট করুন যে প্রক্রিয়াজাত স্ট্রিংয়ের দৈর্ঘ্য পরিবর্তন হয় না। যখন একই (বা অন্য কোনও পৃষ্ঠা) আমার পিএইচপি স্ক্রিপ্টটি আবার চালায়, আমি অক্ষর না হারিয়ে এই কুকিটি পুনরুদ্ধার করতে সক্ষম হব। আমি কেবল কুকিটি আমার নিজের তৈরি করা একই ফিক্স 64 () কলটি দিয়ে ফিরে যেতে হবে এবং সেখান থেকে আমি এটিকে সাধারণ বেস 64_ ডিকোড () দিয়ে ডিকোড করতে পারি, তারপরে আপনার স্কিমের অন্য যে কোনও ডিক্রিপশন অনুসরণ না করে।
আমি পিএইচপিতে এমন কিছু সেটিং তৈরি করতে পারি যা কুকিজে ব্যবহৃত বেস 64 স্ট্রিংগুলিকে দুর্নীতি ছাড়াই পিএইচপিতে ফেরত স্থানান্তর করতে দেয়। গড় সময়ে এটি কাজ করে। "+" একটি "আইনী" কুকির মান হতে পারে তবে আপনার যদি এই জাতীয় স্ট্রিং পিএইচপি-তে ফিরে ((আমার ক্ষেত্রে $ _COOKIE অ্যারের মাধ্যমে) প্রেরণ করতে সক্ষম হতে চান তবে আমি সরিয়ে ফেলার জন্য পুনরায় প্রক্রিয়া করার পরামর্শ দিচ্ছি আপত্তিজনক চরিত্রগুলি, এবং পুনরুদ্ধারের পরে সেগুলি পুনরুদ্ধার করুন। অন্যান্য "কুকি নিরাপদ" চরিত্রগুলি চয়ন করার জন্য রয়েছে।
আপনি যদি পরে ভেরিয়েবলগুলি ব্যবহার করে থাকেন তবে আপনি দেখতে পাবেন যে path
বাস্তবে এর মতো উপাদানগুলি উচ্চারণযুক্ত অক্ষরগুলির মধ্য দিয়ে দেয়, তবে এটি ব্রাউজারের পথের সাথে আসলে মেলে না। তার জন্য আপনার এগুলি ইউআরআইএন কোড করা দরকার। সুতরাং এই মত:
const encodedPath = encodeURI(myPath);
document.cookie = `use_pwa=true; domain=${location.host}; path=${encodedPath};`
সুতরাং "অনুমোদিত" অক্ষর, অনুমানের চেয়ে বেশি হতে পারে। তবে আপনার উচিত অনুমানের মধ্যে থাকা এবং নিরাপদ থাকার জন্য ইউআরআই-এনকোডযুক্ত স্ট্রিংগুলি ব্যবহার করা উচিত।
কয়েক বছর আগে এমএসআইই 5 বা 5.5 (এবং সম্ভবত উভয়ই) এইচটিএমএল ব্লকে "-" নিয়ে কিছু গুরুতর সমস্যা পেয়েছিল যদি আপনি বিশ্বাস করতে পারেন। সার্ভার-সাইড ডাটাবেসে অন্য সমস্ত কিছুর সন্ধানের জন্য আমরা কুকিতে একটি MD5 হ্যাশ (কেবলমাত্র অক্ষর এবং সংখ্যাগুলি সহ) সঞ্চিত করে রেখেছি, এটি সরাসরি সম্পর্কিত নয়।
আমি ব্যবহার শেষ
cookie_value = encodeURIComponent(my_string);
এবং
my_string = decodeURIComponent(cookie_value);
এটি সমস্ত ধরণের চরিত্রের জন্য কাজ করে বলে মনে হচ্ছে। আমার অন্যথায় অদ্ভুত সমস্যাগুলি ছিল, এমনকি এমন অক্ষরগুলিও ছিল যা সেমিকোলন বা কমা ছিল না।
;
যতক্ষণ না ডাবল-কোট দিয়ে ঘিরে থাকে ততক্ষণ চরিত্রটি থাকতে পারে ? যেমন:Set-Cookie: Name=Va";"lue; Max-Age=3600