Gestión de cookies

Con la obligatoriedad el cumplimiento de la normativa en materia de privacidad y protección de datos, la gestión de las cookies, se ha convertido en un proceso importante dentro de cualquier desarrollo web.

En el post de esta semana, os presento una pequeña utilidad que he creado, que permite mostrar un listado de las cookies que usa una aplicación web, muestra una serie de información sobre ellas y permite su eliminación.

Contexto

Esta aplicación, lo que hace es comprobar que cookies están instaladas en el navegador por la web que estamos usando y recoge la información de la cookie (si existe) de una base de datos abierta, donde obtenemos información del nombre, su propietario, su tiempo de retención y el tipo de cookie que es: funcional, analítica o de marketing.

La base de datos que he usado es el proyecto Open-Cookie-Database que proporciona un listado de más de 1700 cookies detalladas por los usuarios y que va creciendo cada día. El proyecto incluye un fichero csv con toda la información, que se puede consultar online, como es el caso de la aplicación que os presento, o se puede descargar y consultar en local.

Esta aplicación también tiene la característica de que conecta a la API de DeepL para hacer la traducción de los contenidos que se descargan del listado de cookies, con lo cual podemos mostrar la información en casi cualquier idioma.

Detalles de la aplicación

La aplicación tiene dos partes funcamentales:

Detección de las cookies instaladas en el navegador y comparación con la base de datos de Open-Cookie-Database.

<?php
function get_cookies() {
    // Verifica si hay cookies almacenadas
    if (isset($_COOKIE) && !empty($_COOKIE)) {
        echo "<table class='table'>
              <thead class='table-dark'>
                <tr>
                    <th>Nombre</th>
                    <th>Tipo</th>
                    <th>Plataforma</th>
                    <th>Descripción</th>
                    <th>Duración</th>
                    <th>Propietario</th>
                    <th></th>
                </tr>
                </thead>";

        // Lee el archivo CSV desde la URL de GitHub
        $csvData = file_get_contents('https://raw.githubusercontent.com/jkwakman/Open-Cookie-Database/master/open-cookie-database.csv');
        $csvRows = str_getcsv($csvData, "\n");

        // Itera a través de todas las cookies
        foreach ($_COOKIE as $nombre) {
            echo "<tr>";
            echo "<td>$nombre</td>";

            // Busca en el archivo CSV para obtener más información sobre la cookie
            $cookieInfo = buscarInformacionCookie($csvRows, $nombre);

            // Muestra la información adicional de la cookie
            if ($cookieInfo) {
                echo "<td>" . traducirTexto($cookieInfo['Tipo'], 'es') . "</td>";
                echo "<td>" . traducirTexto($cookieInfo['Plataforma'], 'es') . "</td>";
                echo "<td>" . traducirTexto($cookieInfo['Descripcion'], 'es') . "</td>";
                echo "<td>" . traducirTexto($cookieInfo['Duracion'], 'es') . "</td>";
                echo "<td>" . traducirTexto($cookieInfo['Propietario'], 'es') . "</td>";

                // Verifica si la categoría es diferente de "Functional" para incluir el botón de eliminar
                if ($cookieInfo['Tipo'] !== 'Functional') {
                    // Agrega un botón para eliminar la cookie
                    echo "<td>
                            <button class='btn btn-danger btn-delete-cookie' data-name='$nombre'>Eliminar</button>
                          </td>";
                } else {
                    // Si la categoría es "Functional", coloca una celda vacía en lugar del botón de eliminar
                    echo "<td>No se pueden eliminar las cookies funcionales o técnicas.</td>";
                }
            } else {
                echo "<td colspan='6'>Información no disponible</td>";
            }

            echo "</tr>";
        }
        echo "</table>";
    } else {
        echo "No se detectaron cookies.";
    }
}

Traduccion de los contenidos a través de DeepL

// Llamada a la API de DeepL para traducir texto
function traducirTexto($texto, $idiomaDestino) {
    $apiKey = 'DEEPL_API_KEY'; // Reemplaza con tu clave de API de DeepL
    $url = 'https://api-free.deepl.com/v2/translate';
    
    $textoTraducido = '';

    $postData = [
        'text' => $texto,
        'target_lang' => $idiomaDestino,
        'auth_key' => $apiKey,
    ];

    $options = [
        'http' => [
            'header' => "Content-type: application/x-www-form-urlencoded\r\n",
            'method' => 'POST',
            'content' => http_build_query($postData),
        ],
    ];

    $context = stream_context_create($options);
    $response = file_get_contents($url, false, $context);

    if ($response !== false) {
        $responseData = json_decode($response, true);
        if (isset($responseData['translations'][0]['text'])) {
            $textoTraducido = $responseData['translations'][0]['text'];
        }
    }

    return $textoTraducido;
}

Borrado del navegador de las cookies no funcionales o técnicas. Si se borran estas cookies técnicas o funcionales, la web que estamos visitando podría no funcionar adecuadamente.

El borrado se hace mediante JQuery y una llamada a Ajax.

<?php

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['eliminar_cookie'])) {
        $cookieNombre = $_POST['eliminar_cookie'];

        // Establece la fecha de expiración en el pasado para eliminar la cookie
        setcookie($cookieNombre, '', time() - 3600, '/');
        
        // Envía una respuesta indicando que la cookie fue eliminada
        echo json_encode(['status' => 'success', 'message' => 'Cookie eliminada']);
    } else {
        echo json_encode(['status' => 'error', 'message' => 'Nombre de cookie no especificado']);
    }
} else {
    echo json_encode(['status' => 'error', 'message' => 'Método no permitido']);
}

Visión general

La aplicación como tal es muy simple, una sola pagina, que muestra una tabla usando Bootstrap, para darle un estilo más agradable.

Como comentaba antes, se puede borrar una cookie, simplemente pulsado el boton de «Eliminar», salvo que sean cookies funcionales o técnicas, que no dará opción.

Es una aplicación muy simple, pero puede servir de punto de partida para el desarrollo de, por ejemplo, un plugin para WordPress para gestionar las cookies, con un poco más de trabajo.

Como siempre, os dejo el código en mi cuenta de GitHub.

Por Jose Manuel Sanz Prieto

Desarrollador web. En este blog hablo de fotografía, programación con Django, Python, PHP y privacidad.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.