사용자가 로그 아웃을 클릭 할 때 내 웹 사이트의 쿠키를 모두 삭제할 수 있는지 궁금합니다.이 기능을 사용하여 쿠키를 삭제했지만 제대로 작동하지 않기 때문입니다.
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 );
?! (에서 메모 scetion 참조 php.net/manual/en/function.setcookie.php를 )
/
당신이 배치 한 결승전의 필요성은 무엇 setcookie
입니까?
/
쿠키 경로입니다. 도메인에서 쿠키를 제거 할 수 있도록 설정해야합니다. 그렇지 않으면 현재 경로로 설정되고 현재 경로에 대해 설정된 쿠키에만 영향을줍니다.
위 답변 중 일부에 동의합니다. "time ()-1000"을 "1"로 바꾸는 것이 좋습니다. 값 "1"은 1970 년 1 월 1 일을 의미하며 100 % 만기를 보장합니다. 따라서:
setcookie($name, '', 1);
setcookie($name, '', 1, '/');
쿠키의 이름을 변경할 때 모든 쿠키를 삭제하고 하나는 보존 할 수도 있습니다.
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-Answer를 기반으로
제공된 답변으로 문제가 해결되지 않았습니다.
그렇지 않았습니다.
내 스크립트는 그렇습니다.
<?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에 올바른 데이터를 유지하려는 경우 쿠키를 삭제하지 않으려는 점을 알고 있어야합니다.
내가 일할 수있는 유일한 해결책은 기존 쿠키를 null로 설정하는 것입니다. 클라이언트에서 쿠키를 삭제할 수 없습니다.
따라서 사용자를 로그 아웃하려면 다음을 사용합니다.
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,"/");
}