Il reindirizzamento URL in PHP è sicuro se utilizzo ../../ come prefisso?

4

Sto sviluppando un'applicazione web PHP e sto implementando una funzionalità di reindirizzamento.

So che il reindirizzamento può essere pericoloso quando può essere impostato sul lato client e io uso ../../ come prefisso per il reindirizzamento.

È sufficiente per assicurarsi che sia possibile reindirizzare solo alle pagine interne? L'ho provato con $_POST['redirurl'] contenente elementi come http://www.evil.com e ; http://www.evil.com ma non lavorati.

È sicuro?

if(isset($_POST['redirurl'])){
    $redir='Location: ../../'.$_POST['redirurl'];
    header($redir);
}
    
posta ozzi- 02.02.2016 - 08:39
fonte

2 risposte

3

Dovresti mai consentire il reindirizzamento a un percorso relativo che può essere manipolato sul lato client. Come dici tu, è pericoloso in quanto potenzialmente consente l'accesso ai file al di fuori del tuo webroot. Un approccio migliore consiste nel "tag" o nel nominare le pagine di destinazione e reindirizzare loro all'interno del codice.

Ad esempio, quando un utente attiva un modulo, lascia postare redirpage con un determinato valore, ad esempio dashboard per reindirizzare un utente a una pagina dashboard. Quindi, nel codice, controlla il nome di una pagina supportata:

switch ($_POST['redirpage']) {
    case 'dashboard':
       header('Location: http://www.example.com/dashboard/');
       break;
    case 'account':
       header('Location: http://www.example.com/account/');
       break;
    default:
        // This fallback will be triggered when an "unknown" target page is set
        header('Location: http://www.example.com/');
}

In questo modo, tu controlla quali reindirizzamenti possono essere eseguiti e dove finiscono.

    
risposta data 02.02.2016 - 10:05
fonte
1

Come sottolinea Oldskool, ci sono altri problemi con questa strategia. Ma potresti anche essere vulnerabile all'iniezione di intestazione.

Dal changelog di header() manuale PHP :

5.1.2: This function now prevents more than one header to be sent at once as a protection against header injection attacks.

Quindi su versioni di PHP precedenti alla 5.1.2 è possibile inviare qualcosa contenente una nuova riga per impostare altre intestazioni (o impostare di nuovo l'intestazione della posizione). Questo è un rischio per la sicurezza. E anche se sei su una versione PHP più recente, cosa succede se qualcuno usa il tuo codice su un vecchio server per qualche motivo che non puoi prevedere? Mitiga questo problema chiamando rawurlencode() sul parametro.

    
risposta data 02.02.2016 - 09:42
fonte

Leggi altre domande sui tag