सर्वर-साइड का पता कैसे लगाएं कि क्या कुकी अक्षम हैं


91

मैं सर्वर (सर्वर-साइड) पर कैसे पता लगा सकता हूं कि क्या ब्राउज़र में कुकीज़ अक्षम हैं? क्या यह संभव है?

विस्तृत विवरण: मैं सर्वर पर एक HTTP अनुरोध संसाधित कर रहा हूं। मैं Set-Cookieहेडर के माध्यम से एक कुकी सेट करना चाहता हूं । मुझे उस समय यह जानना होगा कि क्या कुकी क्लाइंट ब्राउज़र द्वारा सेट की जाएगी या कुकी को सेट करने के मेरे अनुरोध को अनदेखा किया जाएगा।


कहाँ पे? ब्राउज़र (क्लाइंट साइड) में? या सर्वर में? (कौन सा सर्वर)
असफ लवी

7
सर्वर साइड कोड में सक्षम कुकीज़ अक्षम / अक्षम, हाँ।
असफ लवी

आप जावास्क्रिप्ट के बजाय एक गतिशील भाषा का उपयोग करने का मतलब है, कुकीज़ हमेशा क्लाइंट ब्राउज़र में जोड़ी जाती हैं, इसलिए ... कोई सर्वर नहीं!
balexandre

जवाबों:


58

कुकी सेट के साथ एक पुनर्निर्देशित प्रतिक्रिया भेजें; जब कुकी के लिए (विशेष) पुनर्निर्देशित URL परीक्षण संसाधित होता है - यदि यह सामान्य प्रसंस्करण के लिए पुनर्निर्देशित होता है, अन्यथा एक त्रुटि स्थिति में पुनर्निर्देशित होता है।

ध्यान दें कि यह केवल आपको बता सकता है कि ब्राउज़र ने कुकी को सेट करने की अनुमति दी है, लेकिन कितनी देर तक नहीं। मेरी FF मुझे सभी कुकीज़ को "सत्र" मोड में लागू करने की अनुमति देती है, जब तक कि साइट को विशेष रूप से एक अपवाद सूची में नहीं जोड़ा जाता है - ऐसे कुकीज़ को त्याग दिया जाएगा जब FF सर्वर निर्दिष्ट समाप्ति की परवाह किए बिना बंद हो जाता है। और यह वह मोड है जिसे मैं हमेशा एफएफ में चलाता हूं।


14
stackoverflow को छोड़कर?
साइमन_वेचर

9
कई साइटों को छोड़कर, जिनमें से एक वास्तव में SO है।
लॉरेंस डोल

43

इसे पूरा करने के लिए आप जावास्क्रिप्ट का उपयोग कर सकते हैं

लाइब्रेरी:

function createCookie(name, value, days) {
    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    else expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, "", -1);
}

function areCookiesEnabled() {
    var r = false;
    createCookie("testing", "Hello", 1);
    if (readCookie("testing") != null) {
        r = true;
        eraseCookie("testing");
    }
    return r;
}

चलाने के लिए कोड:

alert(areCookiesEnabled());

याद है

यह तभी काम करता है जब जावास्क्रिप्ट सक्षम हो!


23
सवाल यह है कि सर्वर साइड पर कुकीज़ का पता कैसे लगाया जाए। आपका कोड क्लाइंट की तरफ चलता है।
एडम

2
सर्वर साइड - लेकिन उसने निर्दिष्ट नहीं किया कि वह किस सर्वर भाषा का उपयोग कर रहा है! लेकिन चाल एक ही है ... एक कुकी लिखें और देखें कि क्या यह वहां है ... यदि यह है, तो कुकीज़ सक्रिय, यदि नहीं ... अक्षम;)
balexandre

14
इससे कोई फर्क नहीं पड़ता कि वह सर्वर पर किस भाषा का उपयोग कर रहा है। इस सवाल का जवाब HTTP अनुरोधों / प्रतिक्रियाओं के संदर्भ में दिया जा सकता है।
मार्टिज़न

7
उस जावास्क्रिप्ट कोड को ब्राउज़र में चलाना है ताकि यह पता लगाया जा सके कि ब्राउज़र में कुकीज़ सक्षम हैं या नहीं। यह सर्वर-साइड नहीं चल सकता।
२०:४१ पर लोर्ने

4
@ एडडम - हालांकि ओपी ने सर्वर साइड के बारे में पूछा, यदि आप उपयोगकर्ता को सूचित करने की कोशिश कर रहे हैं कि साइट को पूरी तरह से काम करने के लिए कुकीज़ को सक्षम करने की आवश्यकता है, तो क्लाइंट-साइड कुकी परीक्षण इसे प्राप्त कर सकता है (जावास्क्रिप्ट सक्षम है)।
क्रिस

18

मुझे नहीं लगता कि जांच के लिए सीधे तरीके हैं। सबसे अच्छा तरीका कुकी में एक मूल्य को संग्रहीत करना है और उन्हें पढ़ने और यह तय करने का प्रयास करना है कि कुकीज़ सक्षम हैं या नहीं।


16

कुकी समर्थन के लिए जाँच का एक सामान्य तरीका पुनर्निर्देशित है।

यह केवल एक अच्छा विचार है जब उपयोगकर्ता ऐसा कुछ करने की कोशिश कर रहा है जो सत्र शुरू करता है, जैसे लॉग इन करना या अपनी गाड़ी में कुछ जोड़ना। अन्यथा, आप इसे कैसे संभालते हैं, इस पर निर्भर करते हुए, आप संभावित रूप से उपयोगकर्ताओं के लिए अपनी संपूर्ण साइट तक पहुँच को रोक रहे हैं - या बॉट - जो कुकीज़ का समर्थन नहीं करते हैं।

सबसे पहले, सर्वर लॉगिन डेटा को सामान्य के रूप में जांचता है - यदि लॉगिन डेटा गलत है तो उपयोगकर्ता उस फीडबैक को सामान्य रूप से प्राप्त करता है। यदि यह सही है, तो सर्वर तुरंत कुकी और एक पृष्ठ पर पुनर्निर्देशित करता है, जो उस कुकी के लिए जांचने के लिए डिज़ाइन किया गया है - जो कि केवल एक ही URL हो सकता है, लेकिन क्वेरी स्ट्रिंग में जोड़े गए कुछ ध्वज के साथ। यदि वह दूसरा पृष्ठ कुकी प्राप्त नहीं करता है, तो उपयोगकर्ता को यह कहते हुए एक संदेश प्राप्त होता है कि वे लॉग इन नहीं कर सकते क्योंकि कुकीज़ उनके ब्राउज़र पर अक्षम हैं।

यदि आप पहले से ही अपने लॉगिन फ़ॉर्म के लिए पोस्ट-रीडायरेक्ट-गेट पैटर्न का पालन कर रहे हैं, तो कुकी की यह सेटिंग और जाँच कोई अतिरिक्त अनुरोध नहीं जोड़ती है - कुकी को मौजूदा रीडायरेक्ट के दौरान सेट किया जा सकता है, और लोड होने वाले गंतव्य द्वारा चेक किया जा सकता है रीडायरेक्ट के बाद।

अब मैं हर पेज लोड के अलावा उपयोगकर्ता द्वारा शुरू की गई कार्रवाई के बाद केवल कुकी परीक्षण क्यों करता हूं। मैंने देखा है कि साइटें हर एक पृष्ठ पर एक कुकी परीक्षण लागू करती हैं, यह महसूस नहीं करती हैं कि इससे खोज इंजन जैसी चीजों पर प्रभाव पड़ने वाला है जो साइट को क्रॉल करने की कोशिश कर रहे हैं। यही है, अगर किसी उपयोगकर्ता के पास कुकीज़ सक्षम है, तो परीक्षण कुकी एक बार सेट की जाती है, इसलिए उन्हें केवल पहले पृष्ठ पर रीडायरेक्ट को सहना होगा जो वे अनुरोध करते हैं और उसके बाद से कोई रीडायरेक्ट नहीं होते हैं। हालाँकि, किसी भी ब्राउज़र या अन्य उपयोगकर्ता-एजेंट के लिए, एक खोज इंजन की तरह, जो कुकीज़ को वापस नहीं करता है, हर एक पृष्ठ का परिणाम केवल पुनर्निर्देशित हो सकता है।

कुकी के समर्थन के लिए जाँच का एक और तरीका जावास्क्रिप्ट के साथ है - इस तरह, कोई रीडायरेक्ट आवश्यक नहीं है - आप एक कुकी लिख सकते हैं और इसे वापस पढ़ने के लिए लगभग तुरंत देख सकते हैं कि क्या यह संग्रहीत किया गया था और फिर पुनर्प्राप्त किया गया था। इसका नकारात्मक पक्ष यह है कि यह क्लाइंट की तरफ स्क्रिप्ट में चलता है - यानी यदि आप अभी भी इस बारे में संदेश चाहते हैं कि क्या सर्वर पर वापस आने के लिए कुकीज़ का समर्थन किया जाता है, तो आपको अभी भी इसे व्यवस्थित करना होगा - जैसे कि अजाक्स कॉल के साथ।

अपने स्वयं के आवेदन के लिए, मैं 'लॉगिन CSRF' हमलों के लिए कुछ सुरक्षा लागू करता हूं, CSRF हमलों का एक प्रकार, उपयोगकर्ता लॉग इन करने से पहले लॉगिन स्क्रीन पर एक यादृच्छिक टोकन युक्त कुकी सेट करके और उपयोगकर्ता द्वारा उनके लॉगिन को चेक करने पर उस टोकन की जाँच करता है। विवरण। Google से लॉगिन CSRF के बारे में और पढ़ें। इसका एक दुष्प्रभाव यह है कि जिस क्षण वे लॉग इन करते हैं, मैं उस कुकी के अस्तित्व की जांच कर सकता हूं - एक अतिरिक्त रीडायरेक्ट आवश्यक नहीं है।


5

आमतौर पर, आपको साइट पर कुछ कार्रवाई करने के बाद कुकी समर्थन की जांच करने की आवश्यकता हो सकती है, जैसे कि लॉगिन फ़ॉर्म सबमिट करना, उनकी गाड़ी में एक आइटम जोड़ना और इसी तरह।

मेरे लिए वर्तमान में, कुकी समर्थन की जाँच सीएसआरएफ (क्रॉस-साइट रिक्वेस्ट फॉरगेरी) रोकथाम के साथ हाथ से चली जाती है।

CSRF के बारे में और अधिक पढ़ने के लिए आपको शायद कहीं और जाना चाहिए , लेकिन इसके पीछे का विचार यह है कि अन्य साइटें आपके उपयोगकर्ताओं को अपनी स्वयं की साइट पर उनके चयन के छिपे हुए रूप को प्रस्तुत करने में धोखा दे सकती हैं। इसके आस-पास का तरीका कुकी को सेट करने के लिए होता है जब दर्शक एक फॉर्म को देखता है, और एक मिलान टोकन को एक छिपे हुए फॉर्म तत्व के रूप में सेट करता है, और फिर फॉर्म को संसाधित करते समय, जांचें कि कुकी और छिपे हुए फॉर्म तत्व दोनों सेट थे और एक दूसरे से मेल खाते थे। यदि यह एक सीएसआरएफ हमले का प्रयास है, तो साइट उपयोगकर्ता की कुकी से मेल खाने के लिए छिपे हुए क्षेत्र को प्रदान करने में सक्षम नहीं होगी, क्योंकि उपयोगकर्ता की कुकी समान-मूल नीति के तहत उनके लिए पठनीय नहीं होगी।

यदि कोई फ़ॉर्म बिना कुकी के सबमिट किया जाता है, लेकिन इसमें एक मान्य-दिखने वाला टोकन होता है, तो आप इस से यह निष्कर्ष निकाल सकते हैं कि उपयोगकर्ता के पास कुकीज़ अक्षम हैं और एक संदेश फेंक रहा है जो यह दर्शाता है कि उपयोगकर्ता को कुकीज़ को सक्षम करना चाहिए और पुनः प्रयास करना चाहिए। बेशक, दूसरी संभावना यह है कि उपयोगकर्ता एक सीएसआरएफ हमले के प्रयास का शिकार है। इसलिए जब कुकी से मिलान नहीं होता है तो उपयोगकर्ता को रोकना भी उस हमले को रोकने का दुष्प्रभाव होगा।


4

मैंने हमेशा इसका इस्तेमाल किया:

navigator.cookieEnabled

के अनुसार w3schools "cookieEnabled संपत्ति सभी प्रमुख ब्राउज़रों में समर्थित है।"।

हालांकि, यह मेरे लिए तब काम करता है जब मैं फॉर्म का उपयोग कर रहा होता हूं, जहां मैं अतिरिक्त जानकारी भेजने के लिए ब्राउज़र को निर्देश दे सकता हूं।


मुझ से +1। पतन का कोई कारण? यह जावास्क्रिप्ट में कुकी को अवरुद्ध करने का पता लगाने का एक उचित तरीका है (और मेरे लिए क्रोम और IE दोनों में काम करता है)।
मिलान गार्डियन

6
मेरा मानना ​​है कि डाउन वोट इसलिए हैं क्योंकि विशेष रूप से सर्वर साइड से समर्थन का पता लगाने के बारे में पूछे गए प्रश्न। यह क्लाइंट की ओर से समर्थन का परीक्षण करने का सबसे अच्छा तरीका है।
TJ VanToll

3
W3Schools HTML / Javascript / CSS / etc के लिए स्पष्ट रूप से विश्वसनीय स्रोत नहीं है । जानकारी।
ब्रायनह

5
यह केवल तभी परीक्षण करता है जब ब्राउज़र इसका समर्थन करता है। सक्षम होने पर यह परीक्षण नहीं करता है। व्यावहारिक रूप से हर ब्राउज़र इसका समर्थन करता है, इसलिए यह बहुत अधिक बेकार लगता है। माफ़ करना।
स्टकऑनसिमप्लेटिंग्स 19

3

कुकी में कुछ संग्रहीत करने का प्रयास करें, और फिर इसे पढ़ें। यदि आपको वह नहीं मिलता जिसकी आप उम्मीद करते हैं, तो कुकीज़ शायद अक्षम हैं।


बहुत सारी वेबसाइट ऐसा करती हैं। यह संभव नहीं है (सर्वर पर) यह पता लगाने के लिए कि क्या कुकीज़ पहले अनुरोध पर सक्षम हैं, लेकिन आप यह पता लगाने के लिए एक छोटा पुनर्निर्देशन कदम लागू कर सकते हैं।
टॉम लिंजा

2

इस कोड की जाँच करें, यह आपकी मदद करेगा।

<?php
session_start();

function visitor_is_enable_cookie() {
    $cn = 'cookie_is_enabled';
    if (isset($_COOKIE[$cn]))
        return true;
    elseif (isset($_SESSION[$cn]) && $_SESSION[$cn] === false)
        return false;

    // saving cookie ... and after it we have to redirect to get this
    setcookie($cn, '1');
    // redirect to get the cookie
    if(!isset($_GET['nocookie']))
        header("location: ".$_SERVER['REQUEST_URI'].'?nocookie') ;

    // cookie isn't availble
    $_SESSION[$cn] = false;
    return false;
}

var_dump(visitor_is_enable_cookie());

1

यह सवाल कि क्या कुकीज़ "सक्षम" हैं, बहुत अधिक बूलियन है। मेरे ब्राउज़र (ओपेरा) में एक प्रति-साइट कुकी सेटिंग है। इसके अलावा, यह सेटिंग हाँ / नहीं है। सबसे उपयोगी रूप वास्तव में "सत्र-केवल" है, जो सर्वर की समाप्ति तिथि को अनदेखा करता है। यदि आप सेटिंग करने के बाद सीधे इसका परीक्षण करते हैं, तो यह वहां होगा। कल, यह नहीं होगा।

इसके अलावा, चूंकि यह एक सेटिंग है जिसे आप बदल सकते हैं, यहां तक ​​कि परीक्षण करते हैं कि क्या कुकीज केवल परीक्षण के दौरान आपको सेटिंग के बारे में बताती हैं या नहीं । मैंने उस एक कुकी को स्वयं स्वीकार करने का फैसला किया होगा। अगर मुझे स्पैम किया जा रहा है, तो मैं (और कभी-कभी) उस साइट के लिए कुकीज़ बंद कर सकता हूं।


3
अच्छी बात है, लेकिन मुझे सिर्फ यह जानने की जरूरत है कि क्या मेरा सेट-कुकी हेडर परिणाम देगा कि उसी ग्राहक से अगला अनुरोध उस कुकी के साथ आएगा या नहीं। यह मेरे लिए महत्वपूर्ण नहीं है अगर यह स्थायी है या केवल सत्र-केवल है।
अलेक्जेंडर यानोव्स

1

यदि आप केवल यह देखना चाहते हैं कि सत्र कुकीज़ (कुकीज़ जो सत्र के जीवनकाल के लिए मौजूद हैं) सक्षम हैं, तो अपने सत्र मोड को अपने web.config फ़ाइल में AutoDetect पर सेट करें , फिर Asp.Net फ्रेमवर्क क्लाइंट ब्राउज़र में कुकी लिख देगा जिसे AspxAutoDetectCookieSupport कहा जाता है । फिर आप इस कुकी को देखने के लिए अनुरोध कर सकते हैं। यह जानने के लिए कि कुकी पर सत्र कुकीज़ सक्षम हैं या नहीं।

जैसे आपके web.config फ़ाइल सेट में:

<sessionState cookieless="AutoDetect" />

इसके बाद चेक करें कि क्या कुकी क्लाइंट पर सक्षम हैं:

if (Request.Cookies["AspxAutoDetectCookieSupport"] != null)  { ... }

Sidenote: डिफ़ॉल्ट रूप से यह UseDeviceProfile पर सेट है, जो क्लाइंट को कुकी लिखने का प्रयास करेगा, जब तक कि क्लाइंट उनका समर्थन करता है, भले ही कुकीज़ अक्षम हों। मुझे यह थोड़ा अजीब लगता है कि यह डिफ़ॉल्ट विकल्प है क्योंकि यह व्यर्थ की तरह लगता है - सत्र क्लाइंट के ब्राउज़र में कुकीज़ के साथ काम नहीं करेगा, इसके साथ UseDeviceProfile पर सेट करें, और यदि आप कुकी का समर्थन नहीं करने वाले क्लाइंट के लिए कुकलेस मोड का समर्थन करते हैं। , तो क्यों नहीं AutoDetect का उपयोग करें और ग्राहकों के लिए कुकलेस मोड का समर्थन करें जो उन्हें अक्षम कर दिया है ...


1
ASP.NET मानती है मूल प्रश्न प्रौद्योगिकी तटस्थ था
डेविड मूरहाउस

1

मैं "balexandre" के उत्तर के बहुत अधिक सरलीकृत संस्करण का उपयोग कर रहा हूं। यह निर्धारित करने का प्रयास करता है, और कुकीज़ सक्षम होने के निर्धारण के एकमात्र उद्देश्य के लिए एक सत्र कुकी पढ़ना। और हाँ, इसके लिए जावास्क्रिप्ट सक्षम होना चाहिए। यदि आप एक होने की परवाह करते हैं तो आप वहां एक टैग चाहते हैं।

<script>
// Cookie detection
document.cookie = "testing=cookies_enabled; path=/";
if(document.cookie.indexOf("testing=cookies_enabled") < 0)
{
    // however you want to handle if cookies are disabled
    alert("Cookies disabled");
}
</script>
<noscript>
    <!-- However you like handling your no JavaScript message -->
    <h1>This site requires JavaScript.</h1>
</noscript>

1

NodeJS - सर्वर साइड - कुकी चेक रीडायरेक्ट मिडलवेयर - एक्सप्रेस सत्र / कुकी पार्सर

निर्भरता

var express = require('express'),
    cookieParser = require('cookie-parser'),
    expressSession = require('express-session')

मध्यस्थ

return (req, res, next) => {
  if(req.query.cookie && req.cookies.cookies_enabled)
    return res.redirect('https://yourdomain.io' + req.path)
  if(typeof(req.cookies.cookies_enabled) === 'undefined' && typeof(req.query.cookie) === 'undefined') {
    return res.cookie('cookies_enabled', true, {
      path: '/',
      domain: '.yourdomain.io',
      maxAge: 900000, 
      httpOnly: true,
      secure: process.env.NODE_ENV ? true : false
    }).redirect(req.url + '?cookie=1')
  }
  if(typeof(req.cookies.cookies_enabled) === 'undefined') {
    var target_page = 'https://yourdomain.io' + (req.url ? req.url : '')
    res.send('You must enable cookies to view this site.<br/>Once enabled, click <a href="' + target_page + '">here</a>.')
    res.end()
    return
  }
  next()
}

0

cookieEnabledसंपत्ति एक बूलियन मान देता है कि निर्दिष्ट करता है या नहीं, कुकीज़ ब्राउज़र में सक्षम होते हैं

<script>
if (navigator.cookieEnabled) {
    // Cookies are enabled
}
else {
    // Cookies are disabled
}
</script>

ओपी यह जानना चाहता था कि इसे सर्वर-साइड कैसे पहचाना जाए।
जिग्गीमॉन्स्टी

जाहिर है, आपको अपने एप्लिकेशन के लिए उपयुक्त तरीके से उस जानकारी को सर्वर पर वापस लाना होगा। यह स्पष्ट होना चाहिए कि यह निर्धारित करना असंभव है कि ब्राउज़र के साथ बातचीत किए बिना किसी ब्राउज़र में कुकीज़ सक्षम हैं या नहीं।
स्टीव

-1

सक्षम कुकीज़ के लिए navigator.CookieEnabled का उपयोग करें (यह झूठे का सच लौटाएगा) और Html टैग नोस्क्रिप्ट। वैसे navigator.cookieEnabled जावास्क्रिप्ट है तो इसे HTML के रूप में टाइप न करें


1
सवाल सर्वर-साइड चेक का है, क्लाइंट-साइड का नहीं।
इवान एम

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.