cómo borrar todas las cookies de mi sitio web en php

92

Me pregunto si puedo eliminar todas las cookies de mi sitio web cuando un usuario hace clic en cerrar sesión, porque usé esto como función para eliminar las cookies pero no funciona correctamente:

setcookie("user",false);

¿Existe alguna forma de eliminar las cookies de un dominio en PHP?

Mac Taylor
fuente
En la mayoría de los casos, la mejor idea será utilizar las cookies de forma más inteligente y selectiva. Si utiliza sesiones, una cookie será suficiente. De todos modos, realice un seguimiento de las cookies que estableció, entonces no necesitará una forma dinámica de iterar sobre ellas y eliminarlas.
caw

Respuestas:

172

PHP setcookie ()

Tomado de esa página, esto deshabilitará todas las cookies de su dominio:

// 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

Jasonbar
fuente
9
Leí ese comentario, pero realmente no entiendo por qué usar el HTTP_COOKIEvalor sería mejor que recorrer la $_COOKIEmatriz. ¿Tiene alguna razón para eso? Para mí, solo parece más trabajo (doble) para el analizador.
empuje
Por lo que puedo decir, no hay diferencia (excepto el trabajo extra).
Jasonbar
11
@poke: Si los nombres de las cookies están en notación de matriz, por ejemplo: usuario [nombre de usuario] Entonces PHP creará automáticamente una matriz correspondiente en $ _COOKIE. En su lugar, utilice $ _SERVER ['HTTP_COOKIE'], ya que refleja los encabezados de solicitud HTTP reales.
Farhadi
¿Cómo eliminaría todas las cookies, excepto las cookies o las cookies con valores establecidos?
Chill Web Designs
2
He visto situaciones en las que hay 2 cookies con el mismo nombre, pero con diferentes configuraciones de dominio. Uno de ellos entrará en la matriz $ _COOKIE y el otro no. Pero ambos serán visibles en HTTP_COOKIE. Si desea limpiar esta situación, esta es la forma de hacerlo.
dlo
42
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
    setcookie( $key, $value, $past, '/' );
}

Sin embargo, aún mejor es recordar (o almacenarlo en algún lugar) qué cookies están configuradas con su aplicación en un dominio y eliminarlas directamente.
De esa manera, puede estar seguro de eliminar todos los valores correctamente.

dar un toque
fuente
2
gran código, pero ¿no es suficiente para usar setcookie( $key, FALSE );? (ver Notas en php.net/manual/en/function.setcookie.php )
Marco Demaio
@Marco Demaio: Debería serlo, pero lo he visto fallar en el pasado en algunos servidores. Pero, por supuesto, si te funciona, hazlo así :)
pincha
no debería ser una cuestión de servidor, es el PHP el que lo hace internamente. ¿Y cuál es la necesidad de la final en la /que se colocó setcookie?
Marco Demaio
@Marco Demaio: Sí, con servidor me refiero al servidor php. El /es la ruta de cookies. Debe configurarlo para que pueda eliminar las cookies del dominio; de lo contrario, se establece en la ruta actual y solo afecta a las que están configuradas para la ruta actual.
Empuje
@trante ¿¡Eh !? $ key no es una matriz, es una clave.
empuje el
16

Estoy de acuerdo con algunas de las respuestas anteriores. Solo recomendaría reemplazar "time () - 1000" por "1". Un valor de "1" significa el 1 de enero de 1970, lo que garantiza un vencimiento del 100%. Por lo tanto:

setcookie($name, '', 1);
setcookie($name, '', 1, '/');
Doug
fuente
1
Siempre me he preguntado por qué nadie dice que haga esto, y esa es la respuesta que estaba buscando.
Anther
Posiblemente no sea un problema actualmente, pero en un momento algunos navegadores ignoraron una fecha tan antigua por completo, y los valores no se descartarían como deberían. Creo que IE 7 es un ejemplo que hizo esto.
conrad10781
3

asegúrese de llamar a su función setcookie antes de que ocurra cualquier salida en su sitio.

Además, si sus usuarios están cerrando la sesión, también debe eliminar / invalidar sus variables de sesión.

Knittl
fuente
2

Cuando cambia el nombre de sus cookies, es posible que también desee eliminar todas las cookies, pero conservar una:

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

También basado en esta respuesta PHP

Roman Holzner
fuente
1
Sintaxis incorrecta: 1) no hay una construcción AS en la cláusula if 2) reemplace "$ cookies" con $ _COOKIE
Jeff
2

Las respuestas proporcionadas no resolvieron mi problema,

No lo hizo:

  1. Eliminar las cookies del dominio principal (de abc; eliminar bc; cookies),
  2. Elimine las cookies de una ruta superior que no sea la raíz.

Mi guión lo hace, ¿ves?

<?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, '.')));
    }
}

No es la solución más bonita / segura / óptima, así que utilícela solo si no conoce la ruta de las cookies y / o los dominios de las cookies. O usa la idea para crear tu versión.

Wesley Abbenhuis
fuente
Solución perfecta
Shakeel Ahmed
1

Debe tener en cuenta que varias herramientas de seguimiento, como Google Analytics, también usan cookies en su dominio y no desea eliminarlas, si desea tener datos correctos en GA.

La única solución que pude hacer fue establecer las cookies existentes en nulo. No pude borrar las cookies del cliente.

Entonces, para cerrar la sesión de un usuario, uso lo siguiente:

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

Por supuesto, esto no elimina TODAS las cookies.

Martin LeBlanc
fuente
7
No recomendaría almacenar la contraseña de un usuario en una cookie. Ese es un agujero de seguridad serio, especialmente considerando que el 0argumento significa que la cookie ni siquiera está encriptada en tránsito.
Andrew Ensley
1

Todas las respuestas anteriores han pasado por alto que setcookiepodría haberse utilizado con un dominio explícito. Además, es posible que la cookie se haya configurado en un subdominio superior, por ejemplo, si usted estaba en un foo.bar.tar.comdominio, podría haber una cookie configurada tar.com. Por lo tanto, desea deshabilitar las cookies para todos los dominios que podrían haber eliminado la cookie:

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

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

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

    array_shift($host);
}
Gajus
fuente
0

Utilice la función para borrar las cookies:

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

Si pasa true, borra los sessiondatos; de lo contrario, los datos de la sesión se conservan.

Dan Bray
fuente
0

Sé que esta pregunta es antigua, pero esta es una alternativa mucho más fácil:

header_remove();

¡Pero ten cuidado! Borrará TODOS los encabezados, incluidas las cookies, la sesión, etc., como se explica en los documentos .

Borjovsky
fuente
esto realmente no hace nada para eliminar las cookies o algo similar a esa noción, ya que el navegador solo mantiene las cookies almacenadas hasta que caducan. aunque ayuda si otras cosas intentan generar cookies y les impide hacerlo.
My1
0
<?php
      parse_str(http_build_query($_COOKIE),$arr);
      foreach ($arr as $k=>$v) {
        setCookie("$k","",1000,"/");
      }
Gautam Sharma
fuente
Gracias por este fragmento de código, que puede proporcionar ayuda inmediata y limitada. Una explicación adecuada mejoraría enormemente su valor a largo plazo al mostrar por qué es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Edite su respuesta para agregar alguna explicación, incluidas las suposiciones que hizo.
Maximilian Peters