วิธีลบคุกกี้ทั้งหมดในเว็บไซต์ของฉันใน php


93

ฉันสงสัยว่าฉันสามารถลบคุกกี้ของเว็บไซต์ทั้งหมดได้หรือไม่เมื่อผู้ใช้คลิกที่ออกจากระบบเนื่องจากฉันใช้สิ่งนี้เป็นฟังก์ชันในการลบคุกกี้ แต่ทำงานไม่ถูกต้อง:

setcookie("user",false);

มีวิธีลบคุกกี้ของโดเมนหนึ่งใน PHP หรือไม่?


ในกรณีส่วนใหญ่ความคิดที่ดีกว่าคือการเลือกใช้คุกกี้อย่างชาญฉลาดมากขึ้น หากคุณใช้เซสชันคุกกี้หนึ่งชิ้นก็เพียงพอแล้ว อย่างไรก็ตามติดตามคุกกี้ที่คุณตั้งค่าไว้จากนั้นคุณไม่จำเป็นต้องใช้วิธีไดนามิกในการทำซ้ำและลบออก
caw

คำตอบ:


173

PHP setcookie ()

นำมาจากหน้านั้นสิ่งนี้จะยกเลิกการตั้งค่าคุกกี้ทั้งหมดสำหรับโดเมนของคุณ:

// 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อาร์เรย์ คุณมีเหตุผลอะไรไหม? สำหรับฉันแล้วดูเหมือนว่าจะทำงานมากขึ้น (สองเท่า) สำหรับตัวแยกวิเคราะห์
โผล่

ไม่มีความแตกต่างเท่าที่ฉันสามารถบอกได้ (ยกเว้นงานพิเศษ)
jasonbar

11
@poke: หากชื่อคุกกี้อยู่ในรูปแบบ Array เช่น: ผู้ใช้ [ชื่อผู้ใช้] จากนั้น PHP จะสร้างอาร์เรย์ที่เกี่ยวข้องโดยอัตโนมัติใน $ _COOKIE ใช้ $ _SERVER ['HTTP_COOKIE'] แทนเนื่องจากจะสะท้อนส่วนหัวคำขอ HTTP จริง
Farhadi

คุณจะลบคุกกี้ทั้งหมดได้อย่างไรนอกเหนือจากคุกกี้หรือคุกกี้ที่มีค่าที่ตั้งไว้?
Chill Web Designs

2
ฉันเคยเห็นสถานการณ์ที่มีคุกกี้ 2 ตัวที่มีชื่อเดียวกัน แต่มีการตั้งค่าโดเมนที่แตกต่างกัน หนึ่งในนั้นจะทำให้เป็นอาร์เรย์ $ _COOKIE และอีกอันจะไม่ทำ แต่ทั้งสองจะปรากฏใน HTTP_COOKIE หากคุณต้องการทำให้สถานการณ์นี้หมดไปนี่คือวิธีที่ต้องทำ
dlo

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

อย่างไรก็ตามที่ดีไปกว่านั้นคือการจดจำ (หรือเก็บไว้ที่ใดที่หนึ่ง) ซึ่งคุกกี้ถูกตั้งค่าด้วยแอปพลิเคชันของคุณบนโดเมนและลบทั้งหมดโดยตรง
ด้วยวิธีนี้คุณจะมั่นใจได้ว่าจะลบค่าทั้งหมดอย่างถูกต้อง


2
รหัสดี แต่ใช้setcookie( $key, FALSE );ไม่พอ?! (ดู Notes scetion ที่php.net/manual/en/function.setcookie.php )
Marco Demaio

@Marco Demaio: ควรจะเป็น แต่ฉันเคยเห็นว่าล้มเหลวในอดีตในบางเซิร์ฟเวอร์ แต่แน่นอนว่าถ้ามันเหมาะกับคุณก็ทำแบบนั้น :)
โผล่

ไม่ควรเป็นเรื่องของเซิร์ฟเวอร์ แต่เป็น PHP ที่ทำภายใน และอะไรคือความต้องการขั้นสุดท้ายที่/คุณวางไว้setcookie?
Marco Demaio

@Marco Demaio: ใช่กับเซิร์ฟเวอร์ฉันหมายถึงเซิร์ฟเวอร์ php /เป็นเส้นทางคุกกี้ คุณต้องตั้งค่าเพื่อให้คุณสามารถลบคุกกี้ออกจากโดเมนมิฉะนั้นจะถูกตั้งค่าเป็นเส้นทางปัจจุบันและมีผลเฉพาะกับที่ตั้งค่าไว้สำหรับเส้นทางปัจจุบันเท่านั้น
โผล่

@trante หือ!? $ key ไม่ใช่อาร์เรย์ แต่เป็นคีย์
โผล่

16

ฉันเห็นด้วยกับคำตอบข้างต้นบางส่วน ฉันแค่แนะนำให้แทนที่ "time () - 1,000" ด้วย "1" ค่า "1" หมายถึงวันที่ 1 มกราคม 1970 ซึ่งรับประกันการหมดอายุ 100% ดังนั้น:

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

1
ฉันสงสัยมาตลอดว่าทำไมไม่มีใครบอกว่าให้ทำแบบนี้และเป็นคำตอบที่ฉันกำลังมองหา
Anther

อาจไม่ใช่ปัญหาในปัจจุบัน แต่เมื่อถึงจุดหนึ่งเบราว์เซอร์บางตัวไม่สนใจวันที่ที่เก่าทั้งหมดและค่าต่างๆจะไม่ถูกละทิ้งเท่าที่ควร ฉันเชื่อว่า IE 7 เป็นตัวอย่างหนึ่งที่ทำเช่นนี้
conrad10781

3

ตรวจสอบให้แน่ใจว่าคุณเรียกใช้ฟังก์ชัน setcookie ก่อนที่ผลลัพธ์จะเกิดขึ้นบนไซต์ของคุณ

นอกจากนี้หากผู้ใช้ของคุณออกจากระบบคุณควรลบ / ทำให้ตัวแปรเซสชันเป็นโมฆะด้วย


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) ไม่มีโครงสร้าง AS ใน if clause 2) แทนที่ "$ cookies" ด้วย $ _COOKIE
Jeff

2

คำตอบที่ให้มาไม่ได้ช่วยแก้ปัญหาของฉัน

มันไม่ได้:

  1. ลบคุกกี้โดเมนหลัก (จาก abc ลบ bc; คุกกี้)
  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, '.')));
    }
}

ไม่ใช่วิธีแก้ปัญหาที่สวย / ปลอดภัย / เหมาะสมที่สุดดังนั้นให้ใช้วิธีนี้เฉพาะในกรณีที่คุณไม่รู้จักเส้นทางคุกกี้และ / หรือโดเมนคุกกี้ หรือใช้ความคิดเพื่อสร้างเวอร์ชันของคุณ


โซลูชั่นที่สมบูรณ์แบบ
Shakeel Ahmed

1

คุณควรทราบว่าเครื่องมือติดตามต่างๆเช่น Google Analytics ยังใช้คุกกี้บนโดเมนของคุณและคุณไม่ต้องการลบออกหากคุณต้องการมีข้อมูลที่ถูกต้องใน GA

ทางออกเดียวที่ฉันสามารถทำได้คือตั้งค่าคุกกี้ที่มีอยู่ให้เป็นโมฆะ ฉันไม่สามารถลบคุกกี้ออกจากไคลเอนต์ได้

ดังนั้นสำหรับการล็อกผู้ใช้ออกฉันใช้สิ่งต่อไปนี้:

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

แน่นอนว่านี่ไม่ได้ลบคุกกี้ทั้งหมด


8
ฉันไม่แนะนำให้เก็บรหัสผ่านของผู้ใช้ไว้ในคุกกี้ นั่นเป็นช่องโหว่ด้านความปลอดภัยที่ร้ายแรงโดยเฉพาะอย่างยิ่งเมื่อพิจารณาถึง0ข้อโต้แย้งหมายความว่าคุกกี้ไม่ได้รับการเข้ารหัสระหว่างการขนส่ง
Andrew Ensley

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,"/");
      }

ขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือเฉพาะบางอย่างได้ทันที คำอธิบายที่เหมาะสมจะช่วยเพิ่มมูลค่าในระยะยาวได้อย่างมากโดยแสดงให้เห็นว่าเหตุใดจึงเป็นวิธีแก้ปัญหาที่ดีและจะทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตด้วยคำถามอื่น ๆ ที่คล้ายคลึงกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงสมมติฐานที่คุณตั้งขึ้น
Maximilian Peters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.