कैसे php में मेरी वेबसाइट के सभी कुकीज़ को हटाने के लिए


92

अगर कोई उपयोगकर्ता लॉगआउट पर क्लिक करता है तो मैं अपनी सभी वेबसाइट की कुकीज को हटा सकता हूं, क्योंकि मैं कुकीज़ को हटाने के लिए फ़ंक्शन के रूप में उपयोग करता हूं, लेकिन यह ठीक से काम नहीं कर रहा है:

setcookie("user",false);

क्या PHP में एक डोमेन के कुकीज़ को हटाने का एक तरीका है?


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

जवाबों:


172

PHP सेसकुकी ()

उस पृष्ठ से लिया गया, यह आपके डोमेन के लिए सभी कुकीज़ को परेशान करेगा:

// unset cookies
if (isset($_SERVER['HTTP_COOKIE'])) {
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

http://www.php.net/manual/en/function.setcookie.php#73484


9
मैं उस टिप्पणी को पढ़ता हूं, लेकिन मुझे वास्तव में नहीं मिलता कि HTTP_COOKIEमूल्य का उपयोग करना $_COOKIEसरणी के माध्यम से लूपिंग से बेहतर क्यों होगा । क्या आपके पास इसका कोई कारण है? मेरे लिए यह केवल पार्सर के लिए अधिक (डबल) काम जैसा दिखता है।
प्रहार

अभी तक कोई अंतर नहीं है जैसा कि मैं बता सकता हूं (अतिरिक्त काम को छोड़कर)।
जसोबर

11
@ प्रहार: अगर कुकी के नाम ऐरे नोटेशन में हैं, उदाहरण के लिए: उपयोगकर्ता [उपयोगकर्ता नाम] तो PHP स्वचालित रूप से $ _COOKIE में एक संबंधित सरणी बनाएगा। इसके बजाय $ _SERVER ['HTTP_COOKIE'] का उपयोग करें क्योंकि यह वास्तविक HTTP अनुरोध हेडर को दिखाता है।
फरहदी

आप एक कुकीज या कुकीज से अलग सभी कुकीज़ को कैसे सेट वैल्यू के साथ हटाएंगे?
चिल वेब डिज़ाइन्स

2
मैंने ऐसी स्थितियों को देखा है जहां एक ही नाम के साथ 2 कुकीज़ हैं, लेकिन विभिन्न डोमेन सेटिंग्स के साथ। उनमें से एक इसे $ _COOKIE सरणी में बना देगा, और दूसरा नहीं होगा। लेकिन वे दोनों HTTP_COOKIE में दिखाई देंगे। यदि आप इस स्थिति को साफ करना चाहते हैं, तो यह ऐसा करने का तरीका है।
dlo

42
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
    setcookie( $key, $value, $past, '/' );
}

हालांकि, याद रखना बेहतर है (या इसे कहीं स्टोर करें) जो कुकीज़ एक डोमेन पर आपके आवेदन के साथ सेट की जाती हैं और उन सभी को सीधे हटा देती हैं।
इस तरह से आप सभी मानों को सही ढंग से हटाना सुनिश्चित कर सकते हैं।


2
महान कोड, लेकिन उपयोग करने के लिए पर्याप्त नहीं है setcookie( $key, FALSE );? (नोट्स पर scetion देख php.net/manual/en/function.setcookie.php )
मार्को Demaio

@ मार्को डेमायो: यह होना चाहिए, लेकिन मैंने देखा है कि कुछ सर्वरों पर अतीत में विफल। लेकिन ज़ाहिर है, अगर यह आप के लिए काम करता है, बस यह है कि :) की तरह है
प्रहार

यह सर्वर का मामला नहीं होना चाहिए, यह PHP है जो इसे आंतरिक रूप से करता है। और फाइनल की क्या आवश्यकता है जिसे /आपने रखा है setcookie?
मार्को डेमायो

@Marco Demaio: हाँ, सर्वर के साथ मेरा मतलब था php सर्वर। /कुकी पथ है। आपको इसे सेट करने की आवश्यकता है ताकि आप डोमेन से कुकीज़ को हटा सकें, अन्यथा यह वर्तमान पथ पर सेट है, और केवल उन लोगों को प्रभावित करता है जो वर्तमान पथ के लिए सेट हैं।
प्रहार

@ स्ट्रेंट हू !? $ कुंजी एक सरणी नहीं है, यह एक कुंजी है।
प्रहार

16

मैं उपरोक्त कुछ उत्तरों से सहमत हूँ। मैं सिर्फ "1" के साथ "समय () - 1000" की जगह लेने की सलाह दूंगा। "1" के मूल्य का अर्थ है 1 जनवरी, 1970, जो 100% समाप्ति सुनिश्चित करता है। इसलिए:

setcookie($name, '', 1);
setcookie($name, '', 1, '/');

1
मैंने हमेशा सोचा है कि कोई भी ऐसा करने के लिए क्यों नहीं कहता है, और इस तरह का जवाब है जिसकी मुझे तलाश है।
एथोर

संभवतः वर्तमान में कोई समस्या नहीं है, लेकिन एक बिंदु पर कुछ ब्राउज़रों ने एक तिथि को अनदेखा कर दिया है जो सभी एक साथ पुरानी हैं, और मूल्यों को उन्हें नहीं छोड़ना चाहिए। मेरा मानना ​​है कि IE 7 एक उदाहरण है जिसने यह किया है।
conrad10781

3

अपनी साइट पर कोई भी आउटपुट होने से पहले सुनिश्चित करें कि आप अपने सेटकोकी फ़ंक्शन को कॉल करें।

साथ ही, यदि आपके उपयोगकर्ता लॉग आउट कर रहे हैं, तो आपको उनके सत्र चर को हटाना / अमान्य भी करना चाहिए।


2

जब आप अपने कुकीज़ का नाम बदलते हैं, तो आप सभी कुकीज़ हटाना चाहते हैं, लेकिन एक को संरक्षित करें:

if (isset($_COOKIE)) {
    foreach($_COOKIE as $name => $value) {
        if ($name != "preservecookie") // Name of the cookie you want to preserve 
        {
            setcookie($name, '', 1); // Better use 1 to avoid time problems, like timezones
            setcookie($name, '', 1, '/');
        }
    }
}

इस PHP- उत्तर पर भी आधारित है


1
गलत सिंटैक्स: 1) कोई निर्माण नहीं है यदि खंड 2) "$ कुकीज़" को $ _COOKIE के साथ बदलें
जेफ

2

दिए गए जवाबों से मेरी समस्या का समाधान नहीं हुआ,

यह नहीं था:

  1. मूल डोमेन कुकीज निकालें (abc; बीसी हटाएं; कुकीज़);
  2. एक उच्च पथ से कुकीज़ निकालें और फिर रूट करें।

मेरी स्क्रिप्ट करती है, देखें।

<?php function unset_cookie($name)
{
    $host = $_SERVER['HTTP_HOST'];
    $domain = explode(':', $host)[0];

    $uri = $_SERVER['REQUEST_URI'];
    $uri = rtrim(explode('?', $uri)[0], '/');

    if ($uri && !filter_var('file://' . $uri, FILTER_VALIDATE_URL)) {
        throw new Exception('invalid uri: ' . $uri);
    }

    $parts = explode('/', $uri);

    $cookiePath = '';
    foreach ($parts as $part) {
        $cookiePath = '/'.ltrim($cookiePath.'/'.$part, '//');

        setcookie($name, '', 1, $cookiePath);

        $_domain = $domain;
        do {
            setcookie($name, '', 1, $cookiePath, $_domain);
        } while (strpos($_domain, '.') !== false && $_domain = substr($_domain, 1 + strpos($_domain, '.')));
    }
}

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


सही समाधान,
शकील अहमद

1

Google Analytics जैसे विभिन्न ट्रैकिंग टूल के बारे में आपको जानकारी होनी चाहिए, आप अपने डोमेन पर कुकीज़ का उपयोग करते हैं और यदि आप GA में सही डेटा रखना चाहते हैं, तो आप उन्हें हटाना नहीं चाहते हैं।

एकमात्र समाधान जो मुझे काम कर सकता था, वह मौजूदा कुकीज़ को शून्य करने के लिए सेट करना था। मैं ग्राहक से कुकीज़ नहीं हटा सकता।

तो एक उपयोगकर्ता को लॉग आउट करने के लिए मैं निम्नलिखित का उपयोग करता हूं:

setcookie("username", null, time()+$this->seconds, "/", $this->domain, 0);
setcookie("password", null, time()+$this->seconds, "/", $this->domain, 0);

बेशक यह सभी कुकीज़ को नष्ट नहीं करता है।


7
मैं कुकी में उपयोगकर्ता का पासवर्ड संग्रहीत करने की अनुशंसा नहीं करूंगा। यह एक गंभीर सुरक्षा छेद है, विशेष रूप से इस 0तर्क पर विचार करने का मतलब है कि कुकी को पारगमन में एन्क्रिप्ट नहीं किया गया है।
एंड्रयू एनस्ले

1

पिछले सभी उत्तरों ने इस बात की अनदेखी की है कि इसका setcookieउपयोग एक स्पष्ट डोमेन के साथ किया जा सकता था। इसके अलावा, कुकी एक उच्च उप-डोमेन पर सेट की गई हो सकती है, उदाहरण के लिए यदि आप एक foo.bar.tar.comडोमेन पर थे , तो वहां एक कुकी सेट हो सकता है tar.com। इसलिए, आप उन सभी डोमेन के लिए कुकी को अनसेट करना चाहते हैं जो कुकी को छोड़ सकते हैं:

$host = explode('.', $_SERVER['HTTP_HOST']);

while ($host) {
    $domain = '.' . implode('.', $host);

    foreach ($_COOKIE as $name => $value) {
        setcookie($name, '', 1, '/', $domain);
    }

    array_shift($host);
}

0

कुकी साफ़ करने के लिए फ़ंक्शन का उपयोग करें:

function clearCookies($clearSession = false)
{
    $past = time() - 3600;
    if ($clearSession === false)
        $sessionId = session_id();
    foreach ($_COOKIE as $key => $value)
    {
        if ($clearSession !== false || $value !== $sessionId)
            setcookie($key, $value, $past, '/');
    }
}

यदि आप पास होते हैं trueतो यह sessionडेटा को साफ़ करता है, अन्यथा सत्र डेटा संरक्षित है।


0

मुझे पता है कि यह सवाल पुराना है, लेकिन यह बहुत आसान विकल्प है:

header_remove();

लेकिन सावधान रहना! डॉक्स में बताए अनुसार यह हेडर, कुकीज़, सत्र, आदि सहित मिटा देगा ।


यह वास्तव में कुकीज़ या उस धारणा के समान कुछ भी निकालने के लिए वास्तव में कुछ नहीं करता है क्योंकि ब्राउज़र बस किसी भी संग्रहीत कुकीज़ को समाप्त होने तक रखता है। हालांकि यह मदद करता है अगर अन्य चीजें कुकीज़ को स्पॉन करने की कोशिश करती हैं और उन्हें ऐसा करने से रोकती हैं।
My1

0
<?php
      parse_str(http_build_query($_COOKIE),$arr);
      foreach ($arr as $k=>$v) {
        setCookie("$k","",1000,"/");
      }

इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके दीर्घकालिक मूल्य में बहुत सुधार करेगा और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
मैक्सिमिलियन पीटर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.