কুকিজের সার্ভার-সাইড মোছার সঠিক উপায়


141

আমার প্রমাণীকরণের প্রক্রিয়াটির জন্য আমি কোনও অনন্য টোকেন তৈরি করি যখন কোনও ব্যবহারকারী লগ ইন করে এবং এটিকে কোনও কুকিতে রাখে যা প্রমাণীকরণের জন্য ব্যবহৃত হয়।

তাই আমি সার্ভার থেকে এরকম কিছু পাঠাবো:

Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/;

যা সব ব্রাউজারে কাজ করে। তারপরে একটি কুকি মুছে ফেলতে আমি expires1 ম 1970 এর জন্য ফিল্ড সেট সহ অনুরূপ কুকি প্রেরণ করি

Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/; expires=Thu, Jan 01 1970 00:00:00 UTC; 

এবং এটি ফায়ারফক্সে দুর্দান্ত কাজ করে তবে আইই বা সাফারিতে কুকি মুছে দেয় না।

তাহলে কোনও কুকি মুছে ফেলার সবচেয়ে ভাল উপায় কী (জাভাস্ক্রিপ্ট ব্যতীত বেশি)? সেট-অফ-এক্সপায়ার-ইন-দ্য অতীত পদ্ধতিটি ভারী বলে মনে হচ্ছে। এবং এছাড়াও কেন এফএফ এ কাজ করে তবে আইই বা সাফারিতে নয়?


উত্তর:


208

যুক্তযুক্ত একই কুকির মান পাঠানো কুকিটি ; expiresধ্বংস করবে না।

একটি শূন্য মান সেট করে কুকিকে অবৈধ করুন এবং একটি expiresক্ষেত্রও অন্তর্ভুক্ত করুন :

Set-Cookie: token=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT

মনে রাখবেন যে আপনি সমস্ত ব্রাউজারকে কোনও কুকি মুছতে বাধ্য করতে পারবেন না। ক্লায়েন্ট ব্রাউজারটি এমনভাবে কনফিগার করতে পারে যাতে কুকি স্থায়ী হয়, এমনকি স্থির থাকে। উপরে বর্ণিত হিসাবে মান নির্ধারণ করা এই সমস্যার সমাধান করবে।


52
আমি সম্ভবত একটি ফাঁকা লেখাটি আবর্জনা হিসাবে ব্যবহার করার পরিবর্তে "deleted", সম্ভাব্য আইনী মানটি "মুছে ফেলা" সমান হওয়ার সাথে সাথে পরবর্তীকালে বিভ্রান্তি এড়াতে পরামর্শ
দেব

8
হ্যাঁ, আপনি ঠিক বলেছেন মজার বিষয় এটি আগে লক্ষ্য করা যায় নি, আশা করি এটি খুব বেশি সমস্যার কারণ ঘটেনি। yegor256, বেশিরভাগ ক্ষেত্রে একটি খালি মান কাজ করা উচিত। সম্পর্কিত: কিছু লোক এই শিরোনামটি পাঠানোর পরেও কেন তাদের কুকিজ অপসারণ করতে পারে না তা ভাবতে পারে। সেক্ষেত্রে অন্যান্য ডোমেন থেকে কুকিজ দেখুন। উদাহরণস্বরূপ, মোছার পরে foo=bar; domain=www.example.com, অন্য একটি কুকি foo=qux; domain=.example.comব্যবহৃত হবে।
লেকেনস্টেইন

3
"ক্লায়েন্টটি ব্রাউজারটিকে এমনভাবে কনফিগার করতে পারে যাতে কুকি স্থির হয়ে গেলেও স্থায়ী হয় above উপরে বর্ণিত মান নির্ধারণ করা এই সমস্যার সমাধান করবে" " কুকি বিষয়বস্তুগুলিকেও "মুছে ফেলা" তে সেট করার জন্য আপনার অনুরোধটি উপেক্ষা করার জন্য ক্লায়েন্ট ব্রাউজারটি কনফিগার করতে পারেনি? ক্লায়েন্টকে যা চায় না তা করতে বাধ্য করার মতো কোনও উপায় আপনার কাছে নেই।
Ajedi32

@ আজেদী 32 এটি করতে পারে তবে তা করার জন্য আপনাকে অবশ্যই অতিরিক্ত প্রচেষ্টা করতে হবে (ক্লায়েন্ট হিসাবে)। খালি মানটিকে উপেক্ষা করার আচরণটি অনেক বেশি সাধারণ, এটি ব্রাউজারের জন্য যেমন অনুরোধগুলি উপেক্ষা করা বিশেষত সেশন আইডি যা অবৈধ।
লেকেনস্টেইন

2
-1 কারণ আমি কখনই কুকির মেয়াদোত্তীর্ণতা উপেক্ষা করার জন্য কোনও ব্রাউজার কনফিগার করার কোনও উপায় দেখিনি, এবং অবিস্মৃত যে কোনও ব্রাউজার উপস্থিত রয়েছে যা এই জাতীয় বিকল্প সরবরাহ করে। আরও কি, @ ডেভ জার্ভিসের পরিবর্তে সাহসী সম্পাদনার পরে আপনার জবাবের প্রথম বাক্যটি এখন কোনও বড় ব্রাউজার বা কোনও স্পষ্ট-অনুবর্তী ব্যবহারকারী এজেন্টের পক্ষে একেবারেই মিথ্যা। tools.ietf.org/search/rfc6265#section-5.3 dictates যে "ইউজার এজেন্ট, তাহলে যে কোন সময়ে, একটি মেয়াদ শেষ হওয়া কুকি কুকিজ সঞ্চয় বিদ্যমান হবে কুকিজ সঞ্চয় থেকে সব মেয়াদ শেষ হওয়া কুকিজ উচ্ছেদ। ' এবং আমার জ্ঞানের সেরাটি যা প্রতিটি ব্রাউজার বাস্তবে তা করে।
মার্ক আমেরিকা

46

আমার এই উত্তরটি লেখার সময়, এই প্রশ্নের স্বীকৃত উত্তরে এটি প্রদর্শিত হয় যে প্রতিস্থাপনকারী কুকিটির Expiresমূল্য অতীতে থাকা অবস্থায় ব্রাউজারগুলিকে কোনও কুকি মুছতে হবে না । সে দাবি মিথ্যা। সেট Expiresঅতীতে হতে মান বৈশিষ্ট-অনুবর্তী একটি কুকি মুছে ফেলার প্রণালী, এবং ব্যবহারকারী এজেন্ট এটা সম্মান বৈশিষ্ট দ্বারা প্রয়োজন হয়।

Expiresকুকি মুছে ফেলার জন্য অতীতে একটি বৈশিষ্ট্য ব্যবহার করা সঠিক এবং এটি অনুমিত দ্বারা নির্ধারিত কুকিজ অপসারণের উপায়। আরএফসি 6255 এর উদাহরণ বিভাগে বলা হয়েছে:

শেষ অবধি, একটি কুকি অপসারণ করতে, সার্ভার অতীতে একটি মেয়াদোত্তীকরণের তারিখ সহ একটি সেট-কুকি শিরোনাম প্রদান করে। সার্ভারটি কেবল তখনই কুকি সরিয়ে ফেলতে সক্ষম হবে যদি সেট-কুকি শিরোনামের পাথ এবং ডোমেন বৈশিষ্ট্যটি কুকি তৈরি হওয়ার সময় ব্যবহৃত মানের সাথে মেলে।

ব্যবহারকারী এজেন্ট আবশ্যকতা অধ্যায় নিম্নলিখিত প্রয়োজনীয়তা, যা একসঙ্গে প্রভাব প্রয়োগকারী একটি কুকি অবিলম্বে কেটে দেওয়ার জন্য করা আবশ্যক যদি ইউজার এজেন্ট একই নামের যার মেয়াদ শেষ হওয়ার তারিখ অতীতের সঙ্গে একটি নতুন কুকি গ্রহণ করে অন্তর্ভুক্ত

  1. যদি [নতুন কুকি গ্রহণ করার সময়] কুকি স্টোরটিতে নতুন তৈরি কুকির মতো একই নাম, ডোমেন এবং পাথ সহ একটি কুকি থাকে:

    1. ...
    2. ...
    3. পুরাতন-কুকির তৈরি-সময়ের সাথে মেলে নতুন তৈরি কুকির তৈরির সময় আপডেট করুন।
    4. কুকি স্টোর থেকে পুরানো কুকি সরান।
  2. নতুন তৈরি কুকিটি কুকির দোকানে intoোকান।

কুকির অতীতে মেয়াদ শেষ হওয়ার পরে একটি কুকি "মেয়াদোত্তীর্ণ" হয়।

ব্যবহারকারী এজেন্ট কুকি স্টোর থেকে সমস্ত মেয়াদোত্তীর্ণ কুকিজ অপসারণ করতে হবে, যদি কোনও সময়ে, কুকি স্টোরটিতে একটি মেয়াদোত্তীর্ণ কুকি উপস্থিত থাকে।

11.3, 11-4, এবং 12 এর উপরে পয়েন্টগুলির একত্রে অর্থ হ'ল যখন কোনও নতুন কুকি একই নাম, ডোমেন এবং পাথের সাথে প্রাপ্ত হয়, তখন পুরাতন কুকিটি অবশ্যই ছিন্ন করে নতুন কুকির সাথে প্রতিস্থাপন করতে হবে। অবশেষে, মেয়াদ শেষ হওয়া কুকিজ বিষয়ে আরও নির্দেশনা নিচে বিন্দু পরে যে কাজ, যে নতুন কুকি আবশ্যক এছাড়াও অবিলম্বে উচ্ছেদ করা হবে। অনুমানটি এই পয়েন্টে ব্রাউজারগুলিকে কোনও উইগল রুম দেয় না; যদি কোনও ব্রাউজার ব্যবহারকারীকে কুকির মেয়াদোত্তীকরণ নিষ্ক্রিয় করার বিকল্প প্রস্তাব করে, যেমন গৃহীত উত্তরটি কিছু ব্রাউজারের পরামর্শ দেয়, তবে এটি অনুমানের লঙ্ঘন হবে। (এই জাতীয় বৈশিষ্ট্যটির খুব সামান্য ব্যবহারও হবে এবং যতদূর আমি জানি এটি কোনও ব্রাউজারে নেই))

তাহলে, কেন এই প্রশ্নের ওপি এই পদ্ধতির ব্যর্থতা পর্যবেক্ষণ করেছে? যদিও আমি ইন্টারনেট এক্সপ্লোরার এর কপিটি পরীক্ষা করার জন্য একটি অনুলিপি ধুয়ে ফেলিনি, তবে আমার সন্দেহ হয় যে এটি ওপিটির Expiresমানটি ত্রুটিযুক্ত ছিল! তারা এই মানটি ব্যবহার করেছে:

expires=Thu, Jan 01 1970 00:00:00 UTC;

তবে এটি সিনট্যাক্টিকালি দুটি উপায়ে অবৈধ।

সিনট্যাক্স অধ্যায় বৈশিষ্ট নির্দেশনা যে মান Expiresঅ্যাট্রিবিউটে একটি হওয়া আবশ্যক

rfc1123- তারিখ, [আরএফসি 2616], বিভাগ 3.3.1 এ সংজ্ঞায়িত

উপরের দ্বিতীয় লিঙ্কটি অনুসরণ করে, আমরা এটি ফর্ম্যাটটির উদাহরণ হিসাবে পেয়েছি:

Sun, 06 Nov 1994 08:49:37 GMT

এবং এটি সিনট্যাক্স সংজ্ঞাটি আবিষ্কার করুন ...

  1. প্রশ্নাবলীর দ্বারা ব্যবহৃত তারিখগুলি দিনের মাসের বছরের ফরম্যাটে নয়, মাসের দিন বছরের ফরম্যাটে লেখা উচিত ।

    বিশেষত, এটি rfc1123-dateনিম্নলিখিত হিসাবে সংজ্ঞা দেয় :

    rfc1123-date = wkday "," SP date1 SP time SP "GMT"
    

    এবং এর date1মতো সংজ্ঞা দেয় :

    date1        = 2DIGIT SP month SP 4DIGIT
                 ; day month year (e.g., 02 Jun 1982)
    

এবং

  1. UTCটাইমজোন হিসাবে অনুমতি দেয় না ।

    এই ফর্মটিতে টাইমজোন অফসেটগুলি কী এই ফর্ম্যাটে গ্রহণযোগ্য তা সম্পর্কে নিম্নলিখিত বিবৃতিটি রয়েছে:

    সমস্ত HTTP তারিখ / সময় স্ট্যাম্পগুলি ব্যতিক্রম ছাড়াই গ্রিনউইচ মিন টাইম (GMT) তে প্রতিনিধিত্ব করা আবশ্যক।

    আরো কি, যদি আমরা এই DATETIME বিন্যাসের মূল বৈশিষ্ট গভীরে, আমরা যে তার প্রাথমিক বৈশিষ্ট https://tools.ietf.org/html/rfc822 , সিনট্যাক্স অধ্যায় তালিকা "কেন্দ্রশাসিত অঞ্চল" ( "ইউনিভার্সাল টাইম" মানে ) সম্ভাব্য মান হিসাবে, তবে ইউটিসি (সমন্বিত ইউনিভার্সাল সময়) বৈধ হিসাবে তালিকাভুক্ত করে না । আমি যতদূর জানি, এই তারিখের ফর্ম্যাটে "ইউটিসি" ব্যবহার করা কখনই বৈধ ছিল না; এটা একটি বৈধ মান যখন বিন্যাস প্রথম 1982 উল্লেখিত হয়েছিল এবং HTTP- র বৈশিষ্ট একটি কঠোরভাবে অবলম্বন করেছেন ছিল না আরো "জিএমটি" ছাড়া অন্য সমস্ত "জোন" মান ব্যবহার নিষিদ্ধ দ্বারা বিন্যাসের নিয়ন্ত্রণমূলক সংস্করণ।

যদি এখানে প্রশ্নকারী প্রশ্নকর্তার পরিবর্তে এই জাতীয়Expires বৈশিষ্ট্য ব্যবহার করে থাকে , তবে:

expires=Thu, 01 Jan 1970 00:00:00 GMT;

তাহলে সম্ভবত এটি কাজ করত।


15

কোনও অতীত তারিখে "মেয়াদোত্তীর্ণ" সেট করা কোনও কুকি মোছার মানক উপায়।

আপনার সমস্যা সম্ভবত কারণ তারিখ ফর্ম্যাট প্রচলিত নয়। আইই সম্ভবত জিএমটি আশা করে।


2

"মেয়াদ শেষ" না হয়ে সর্বোচ্চ-বয়স = -1 ব্যবহার করুন। এটি সংক্ষিপ্ত আকারের, সিনট্যাক্স সম্পর্কে কম বাছাইযোগ্য এবং ম্যাক্স-এজ কোনওভাবেই মেয়াদ শেষ হওয়ার চেয়ে অগ্রাধিকার নেয়।


-1

গ্লাস ফিশ জার্সি জ্যাক-আরএস প্রয়োগের জন্য আমি সাধারণ পদ্ধতিতে এই সমস্যাটি সমাধান করেছি সমস্ত সাধারণ পরামিতি বর্ণনা করছি। কমপক্ষে তিনটি প্যারামিটারের সমান হতে হবে: নাম (= "নাম"), পথ (= "/") এবং ডোমেন (= নাল):

public static NewCookie createDomainCookie(String value, int maxAgeInMinutes) {
    ZonedDateTime time = ZonedDateTime.now().plusMinutes(maxAgeInMinutes);
    Date expiry = time.toInstant().toEpochMilli();
    NewCookie newCookie = new NewCookie("name", value, "/", null, Cookie.DEFAULT_VERSION,null, maxAgeInMinutes*60, expiry, false, false);
    return newCookie;
}

এবং এটিকে কুকি সেট করার সাধারণ উপায়ে ব্যবহার করুন:

NewCookie domainNewCookie = RsCookieHelper.createDomainCookie(token, 60);
Response res = Response.status(Response.Status.OK).cookie(domainNewCookie).build();

এবং কুকি মুছতে:

NewCookie domainNewCookie = RsCookieHelper.createDomainCookie("", 0);
Response res = Response.status(Response.Status.OK).cookie(domainNewCookie).build();

আমার জন্য যখন আমি ম্যাক্সএজ 0 তে সেট করি তখন এটি সর্বোচ্চ-বয়স = 0 সহ একটি কুকি দেয় যা ক্রোম উপেক্ষা করে বলে মনে হয়। ইন বোঝায় যা RFC 6265 অধ্যায় 4.1.1 এটি হিসাবে "নন-জিরো অঙ্ক" সর্বোচ্চ-বয়স বাক্য গঠন প্রণালী নির্দিষ্ট করে। কারণ হতে পারে। যদিও @ জোশসি 13 দ্বারা উল্লিখিত হয়েছে, বিভাগ 5.2.2 শূন্যের চেয়ে কম বা সমান মানের ব্যাখ্যা করার বিষয়ে আলোচনা করে। সুতরাং এটি সেখানে
একরকমভাবে

আমি বিশদ জানি না, তবে যুগলযুক্ত এই মানগুলি ক্রোম এবং অন্যান্য ব্রাউজারগুলিতে সত্যিই কাজ করছে: ম্যাক্সএজইনমিনিটস * 60, মেয়াদোত্তীর্ণ।
রাউটসম্যাপস ডট কম

1
@ ম্যাথিজ ওয়েজসেলস ভাল ক্যাচ! আমি আরও গভীর খনন করেছি, এবং আপাত দ্বন্দ্বটি বাস্তবে ইচ্ছাকৃত, যেমনটি rfc-editor.org/errata/eid3430-উল্লিখিত হয়েছে । "আন্তঃঅযুক্তি সর্বাধিকতর করতে", ব্যবহারকারীর এজেন্টদের শূন্য বা নেতিবাচক Max-Ageহিসাবে প্রাথমিক উপস্থাপনের তারিখ এবং সময় হিসাবে ব্যাখ্যা করা প্রয়োজন , তবে সার্ভারগুলি এ জাতীয় Max-Ageমান প্রেরণ করতে নিষেধ করেছে । আমি অনুমান করি যে লেখকগণ বিদ্যমান ক্লায়েন্টদের উভয়ই জানেন যা হ্যান্ডেল করতে পারে না Max-Age=0এবং সার্ভারগুলি যেটি প্রেরণ করেছিল সেই সময় তারা পাঠিয়েছিল এবং উভয় প্রান্ত থেকে সমস্যাটি প্রশমিত করার চেষ্টা করেছিল।
মার্ক আমেরিকা

@ ক্রিমিয়ান.আস আমি আর তিরস্কার করতে পারি না। হতে পারে আমি কিছু ভুল করেছি
ম্যাথিজস ওয়েসেলস

@ ম্যাথিজওয়েসেলস সর্বাধিক বয়সকে অগ্রাহ্য করার সমস্যা = 0 আমার উদাহরণে জোনডেটটাইমটাইম.নো ()। এ প্লাসমিনুটস (ম্যাক্সএজআইএনমিনস) সেট করার মাধ্যমে স্থির করা হয়েছে। ম্যাকএজআইইনমিনুটস = ​​0 এর জন্য এটি বর্তমান তারিখের সময়। এই কোডটি বাস্তব ওয়েব অ্যাপ্লিকেশনে দীর্ঘ সময় ধরে কাজ করছে।
RoutesMaps.com
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.