Pasar el ID de sesión en la cadena de consulta para mantener el estado en un iframe de terceros: ¿buena práctica?

2

Me gustaría permitir que el usuario "inicie sesión" y mantenga el estado / sesión iniciada entre las páginas dentro de un iframe. El contenido de iframe es nuestro y se alojará en los sitios web de varios clientes.

Como es probable que la cookie de sesión habitual sea bloqueada como una cookie de terceros, estoy tratando de encontrar una forma adecuada de hacerlo.

Estoy considerando pasar siempre ?PHPSESSID=x en la cadena de consulta para cada URL relevante como solución.

¿Se considera esto una mala práctica y existen riesgos?

    
pregunta Marc 01.12.2014 - 13:58
fuente

3 respuestas

1
  

Estoy considerando pasar siempre? PHPSESSID = x en la cadena de consulta para   cada url relevante como solución.

Esta no es la mejor práctica, pero si decides elegir este método (porque es fácil), puedes hacer algo como esto:

<?php

    define("COOKIE_NAME", "PHPSESSID");
    define("DOMAIN", "example.com");

    function is_valid_cookie($cookie){
        //Test if the cookie is valid and does not have any malicious chars (";", etc)

        //...
        return true;

        //...
        return false;
    }

    function is_logged_in(){
        //Test if the user is logged in

        //...
        return true;

        //...
        return false;
    }

    function sanitize_url($url){
        //Sanitize URL
        //If you have PHP >= 4.4.2 or PHP >= 5.1.2, I believe you have nothing to worry here

        //...
        return $url;
    }


    function remove_querystring_var($url, $toRemove){
        //Removes $toRemove from query string of the $url
        $parsed = array();
        parse_str(substr($url, strpos($url, '?')+1), $parsed);
        $url = substr($url, 0, strpos($url, '?'));
        unset($parsed[$toRemove]);
        if(!empty($parsed)){
            $url .= '?' . http_build_query($parsed);
        }
        return $url;
    }

    if(isset($_GET[COOKIE_NAME])){
        if(is_valid_cookie($_GET[COOKIE_NAME])){
            setcookie(COOKIE_NAME, $_GET[COOKIE_NAME], time()+24*3600, "/", ".".DOMAIN, true, true);
            header("Location: ".sanitize_url(remove_querystring_var("https://".DOMAIN.$_SERVER["REQUEST_URI"], COOKIE_NAME)));
            exit(0);
        }
        else{
            header("Location: ".sanitize_url(remove_querystring_var("https://".DOMAIN.$_SERVER["REQUEST_URI"], COOKIE_NAME)));
            exit(0);
        }
    }
    else if(!is_logged_in()){
        echo "Invalid session!";
        exit(0);
    }

    //...
    echo "Welcome!";

?>

Ejemplo:

Google usará y excluirá la variable & auth, pero mantendrá la & nada, porque & auth tiene datos confidenciales para Google.

    
respondido por el Lucas NN 02.12.2014 - 02:55
fuente
1

Echa un vistazo a cómo otros resuelven esto. Por ejemplo, Facebook tiene el mismo problema porque incluye sus aplicaciones como iframes.

En el sdk actual se implementa un auth pero el versión anterior es mucho más simple. Básicamente todo se reduce a esto:

$data['issued_at'] = time();
$json = json_encode($data);
$b64 = self::base64UrlEncode($json);
$signature = hash_hmac('sha256', $b64, $this->getAppSecret(), true);

Tienen una matriz con los datos como su token de sesión. Firman estos datos con una contraseña secreta para que nadie pueda cambiarlos. Se agrega una marca de tiempo para denegar los ataques de reproducción. Ahora transfiere los datos $ b64 y la firma $ a la otra página web. En el otro lado, verifica que la firma aún coincida con los datos.

Full oauth es probablemente mejor, pero un poco más de trabajo.

    
respondido por el PiTheNumber 13.01.2015 - 09:51
fuente
0

Es una mala práctica. Siempre que pueda, reutilice lo que ya existe en lugar de crear el suyo propio. La administración de sesiones es bastante común y simplemente funciona.

  

Dado que la cookie de sesión habitual probablemente será bloqueada como una tercera   cookie de fiesta Estoy tratando de encontrar una manera adecuada de hacer esto.

No, la cookie no se bloqueará en su iframe. Las cookies se configuran en todo el navegador y se les aplica la misma política de origen. Es por eso que no importa si abre la página en una nueva pestaña, nueva ventana o nuevo iframe, la cookie seguirá siendo enviada.

  

Estoy considerando pasar siempre? PHPSESSID = x en la cadena de consulta para   cada url relevante como solución.

Este answer contiene Una buena información sobre esa práctica. No es automáticamente inseguro si utiliza HTTPS y un ID de sesión aleatorio lo suficientemente largo. Pero podría causar problemas si las personas comienzan a compartir la URL entre ellas, por ejemplo, ya que la URL contiene información sobre su sesión.

    
respondido por el Gudradain 01.12.2014 - 15:32
fuente

Lea otras preguntas en las etiquetas