ฉันสงสัยว่าฉันสามารถลบคุกกี้ของเว็บไซต์ทั้งหมดได้หรือไม่เมื่อผู้ใช้คลิกที่ออกจากระบบเนื่องจากฉันใช้สิ่งนี้เป็นฟังก์ชันในการลบคุกกี้ แต่ทำงานไม่ถูกต้อง:
setcookie("user",false);
มีวิธีลบคุกกี้ของโดเมนหนึ่งใน PHP หรือไม่?
ฉันสงสัยว่าฉันสามารถลบคุกกี้ของเว็บไซต์ทั้งหมดได้หรือไม่เมื่อผู้ใช้คลิกที่ออกจากระบบเนื่องจากฉันใช้สิ่งนี้เป็นฟังก์ชันในการลบคุกกี้ แต่ทำงานไม่ถูกต้อง:
setcookie("user",false);
มีวิธีลบคุกกี้ของโดเมนหนึ่งใน 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_COOKIE
ค่าจะดีไปกว่าการวนลูปผ่าน$_COOKIE
อาร์เรย์ คุณมีเหตุผลอะไรไหม? สำหรับฉันแล้วดูเหมือนว่าจะทำงานมากขึ้น (สองเท่า) สำหรับตัวแยกวิเคราะห์
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
setcookie( $key, $value, $past, '/' );
}
อย่างไรก็ตามที่ดีไปกว่านั้นคือการจดจำ (หรือเก็บไว้ที่ใดที่หนึ่ง) ซึ่งคุกกี้ถูกตั้งค่าด้วยแอปพลิเคชันของคุณบนโดเมนและลบทั้งหมดโดยตรง
ด้วยวิธีนี้คุณจะมั่นใจได้ว่าจะลบค่าทั้งหมดอย่างถูกต้อง
setcookie( $key, FALSE );
ไม่พอ?! (ดู Notes scetion ที่php.net/manual/en/function.setcookie.php )
/
คุณวางไว้setcookie
?
/
เป็นเส้นทางคุกกี้ คุณต้องตั้งค่าเพื่อให้คุณสามารถลบคุกกี้ออกจากโดเมนมิฉะนั้นจะถูกตั้งค่าเป็นเส้นทางปัจจุบันและมีผลเฉพาะกับที่ตั้งค่าไว้สำหรับเส้นทางปัจจุบันเท่านั้น
ฉันเห็นด้วยกับคำตอบข้างต้นบางส่วน ฉันแค่แนะนำให้แทนที่ "time () - 1,000" ด้วย "1" ค่า "1" หมายถึงวันที่ 1 มกราคม 1970 ซึ่งรับประกันการหมดอายุ 100% ดังนั้น:
setcookie($name, '', 1);
setcookie($name, '', 1, '/');
ตรวจสอบให้แน่ใจว่าคุณเรียกใช้ฟังก์ชัน setcookie ก่อนที่ผลลัพธ์จะเกิดขึ้นบนไซต์ของคุณ
นอกจากนี้หากผู้ใช้ของคุณออกจากระบบคุณควรลบ / ทำให้ตัวแปรเซสชันเป็นโมฆะด้วย
เมื่อคุณเปลี่ยนชื่อคุกกี้คุณอาจต้องการลบคุกกี้ทั้งหมด แต่เก็บคุกกี้ไว้:
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 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, '.')));
}
}
ไม่ใช่วิธีแก้ปัญหาที่สวย / ปลอดภัย / เหมาะสมที่สุดดังนั้นให้ใช้วิธีนี้เฉพาะในกรณีที่คุณไม่รู้จักเส้นทางคุกกี้และ / หรือโดเมนคุกกี้ หรือใช้ความคิดเพื่อสร้างเวอร์ชันของคุณ
คุณควรทราบว่าเครื่องมือติดตามต่างๆเช่น Google Analytics ยังใช้คุกกี้บนโดเมนของคุณและคุณไม่ต้องการลบออกหากคุณต้องการมีข้อมูลที่ถูกต้องใน GA
ทางออกเดียวที่ฉันสามารถทำได้คือตั้งค่าคุกกี้ที่มีอยู่ให้เป็นโมฆะ ฉันไม่สามารถลบคุกกี้ออกจากไคลเอนต์ได้
ดังนั้นสำหรับการล็อกผู้ใช้ออกฉันใช้สิ่งต่อไปนี้:
setcookie("username", null, time()+$this->seconds, "/", $this->domain, 0);
setcookie("password", null, time()+$this->seconds, "/", $this->domain, 0);
แน่นอนว่านี่ไม่ได้ลบคุกกี้ทั้งหมด
0
ข้อโต้แย้งหมายความว่าคุกกี้ไม่ได้รับการเข้ารหัสระหว่างการขนส่ง
คำตอบก่อนหน้านี้ทั้งหมดมองข้ามไปว่า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);
}
ใช้ฟังก์ชันเพื่อล้างคุกกี้:
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
ข้อมูลมิฉะนั้นข้อมูลเซสชันจะถูกเก็บรักษาไว้
<?php
parse_str(http_build_query($_COOKIE),$arr);
foreach ($arr as $k=>$v) {
setCookie("$k","",1000,"/");
}