2009-02-10 8 views
88

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

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

+0

कहाँ में सक्षम होते हैं देता है? ब्राउज़र में (क्लाइंट साइड)? या सर्वर में? (कौन सा सर्वर) –

+1

सर्वर में कुकीज़ ???? – balexandre

+7

सर्वर पक्ष कोड में सक्षम कुकीज़ सक्षम/अक्षम, हां। –

उत्तर

55

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

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

+13

स्टैक ओवरफ्लो को छोड़कर? –

+9

कई साइटों के अलावा, जिनमें से एक वास्तव में SO है। –

3

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

+0

कई वेबसाइटें यह करती हैं। * पहले * अनुरोध पर कुकीज़ सक्षम होने पर यह पता लगाने के लिए संभव नहीं है (सर्वर पर), लेकिन आप इसे समझने के लिए एक छोटा रीडायरेक्ट चरण लागू कर सकते हैं। –

17

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

44

आपको लगता है कि

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

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()); 

याद रखें

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

+22

प्रश्न यह है कि सर्वर पक्ष पर कुकीज़ का पता कैसे लगाएं। आपका कोड क्लाइंट साइड पर चलता है। – Adam

+2

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

+14

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

1

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

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

+3

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

15

कुकी समर्थन के लिए जांच का एक आम तरीका एक रीडायरेक्ट के माध्यम से है।

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

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

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

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

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

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

1

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

उदा। अपने web.config फ़ाइल सेट में:

<sessionState cookieless="AutoDetect" /> 

फिर देखें कि कुकीज़ के साथ ग्राहक पर सक्षम हैं:

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

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

+1

एएसपी.NET मानता है मूल प्रश्न तकनीक से तटस्थ –

5

मैं हमेशा इस प्रयोग किया है:

navigator.cookieEnabled 

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

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

+0

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

+6

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

+3

डब्ल्यू 3 स्कूल्स स्पष्ट रूप से [विश्वसनीय स्रोत नहीं] (http://w3fools.com/) HTML/जावास्क्रिप्ट/सीएसएस/आदि के लिए है। जानकारी। – BryanH

5

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

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

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

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

1

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

<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

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

+1

प्रश्न सर्वर-साइड चेक के संबंध में है, क्लाइंट-साइड नहीं। –

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()); 
0

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

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

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

संबंधित मुद्दे

 संबंधित मुद्दे