Passando id di sessione nella stringa di query per mantenere lo stato in iframe di terze parti - buona pratica?

2

Vorrei consentire all'utente di "accedere" e mantenere lo stato / stato di accesso tra le pagine all'interno di un iframe. Il contenuto dell'iframe è nostro e sarà ospitato sui vari siti Web dei clienti.

Poiché il solito cookie di sessione sarà probabilmente bloccato come cookie di terze parti, sto cercando di trovare un modo adeguato per farlo.

Sto considerando di passare sempre ?PHPSESSID=x nella stringa di query per ogni url rilevante come soluzione alternativa.

È considerata una cattiva pratica e ci sono rischi?

    
posta Marc 01.12.2014 - 13:58
fonte

3 risposte

1

I am considering always passing ?PHPSESSID=x in the query string for each relevant url as a workaround.

Questa non è la migliore pratica, ma se decidi di scegliere questo metodo (perché è facile), puoi fare qualcosa del genere:

<?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!";

?>

Esempio:

link

Google utilizzerà ed esclude la variabile & auth, ma manterrà il & qualsiasi cosa, poiché & ha l'autorizzazione per i dati sensibili per Google.

    
risposta data 02.12.2014 - 02:55
fonte
1

Dai un'occhiata a come altri risolvere questo. Ad esempio, Facebook ha lo stesso problema perché include le sue app come iframe.

Nel sdk corrente implementano un oauth ma versione dell'older è molto più semplice. Fondamentalmente si tratta di questo:

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

Hanno una matrice con i dati come il token di sessione. Firmano questi dati con una password segreta, quindi non possono essere modificati da nessuno. Viene aggiunto un timestamp per negare gli attacchi di replay. Ora trasferisci i dati $ b64 e $ signature sull'altra pagina web. Dall'altro lato si verifica che la firma corrisponda ancora ai dati.

Il full oauth è probabilmente migliore ma un po 'più di lavoro.

    
risposta data 13.01.2015 - 09:51
fonte
0

È una cattiva pratica. Ogni volta che puoi, riusa ciò che già esiste invece di crearne uno tuo. La gestione delle sessioni è abbastanza comune e funziona.

Since the usual session cookie will most likely be blocked as a third party cookie I am trying to find a suitable way to do this.

No, il cookie non verrà bloccato nel tuo iframe. I cookie sono impostati a livello di browser e la stessa politica di origine si applica a loro. Ecco perché non importa se apri la pagina in una nuova scheda, in una nuova finestra o in un nuovo iframe, il cookie verrà comunque inviato.

I am considering always passing ?PHPSESSID=x in the query string for each relevant url as a workaround.

Questa answer contiene alcune buone informazioni su quella pratica. Non è automaticamente insicuro se si utilizza HTTPS e un ID sessione casuale abbastanza lungo. Ma potrebbe causare problemi se le persone iniziano a condividere l'url tra loro, ad esempio, poiché l'URL contiene informazioni sulla tua sessione.

    
risposta data 01.12.2014 - 15:32
fonte

Leggi altre domande sui tag