Come impedire l'hotlinking sul contenuto binario servito tramite PHP?

0

Sto cercando di proteggere uno script di byte serving, scritto in PHP, per lo più preso da link per proteggere dal collegamento diretto del video e dal download semplice. Pertanto ho posizionato il video all'esterno della http-root pubblica. Lo pseudo-streaming funziona perfettamente alla perfezione.

La struttura delle pagine come questa:
mysite.com/watchvideo.php:

<video>
  <source src="/media.php?t=<?= $t = Token::generate(); ?>" type="video/mp4">
</video>

mysite.com/ media.php:

$token = isset($_GET["t"]) ? $_GET["t"] : "";

if (
    !Token::check($token)
    || $_SERVER["HTTP_REFERER"] !== "mysite.com/watchthisawesomevideo.php"
    ) {
        header("HTTP/1.1 403 Forbidden");
        exit;
}

do_the_byte_range_stuff();              // from tuxxin.com

La classe Token genera semplicemente una stringa casuale, la salva nella sessione php e la restituisce, rispettivamente, quando verifica il confronto del parametro con il token memorizzato in $_SESSION .

Con questo metodo ho il problema che alcuni browser, come stock e chrome 47 su Android 4.1.2, sembrano passare lo streaming ad un processo diverso, perdendo quindi il HTTP_REFERER (possibilmente correlato: Android 1780). Se disattivo il token al momento del controllo, le richieste successive a media.php vengono annullate. Lo stesso vale se imposto un limite di tempo per il token.

Una volta ordinato, nasconderei il video e ne rispecchi il contenuto su una tela.

Quali sarebbero le misure di sicurezza idonee per proteggere dal download del file video e rendere media.php inaccessibile? So che non può esserci protezione assoluta, ma voglio renderlo ragionevolmente difficile.

Modifica: Tieni presente che non sto cercando alcuna forma di DRM per il video poiché so che potrebbe essere semplicemente registrato dallo schermo. Sto cercando dei modi per ottenere il video sulla pagina di videovideo rendendolo accessibile solo da lì e impedendo il collegamento a caldo.

    
posta YPOC 26.01.2016 - 18:03
fonte

1 risposta

2

Puoi impostare un cookie quando l'utente richiede watchvideo.php , contenente un hash di valori che identificano il client, come agente utente , indirizzo IP , e così:

<?php
 $ip = $_SERVER['REMOTE_ADDR'];
 $browser = implode(':', $_SERVER['HTTP_USER_AGENT']);
 $userFingerprint = md5($browser . $ip);
 setcookie('userdata', $userFingerprint, time() + 10); //expires in 10 sec
?>

On media.php , leggi il cookie indietro:

<?php
 $ip = $_SERVER['REMOTE_ADDR'];
 $browser = implode(':', $_SERVER['HTTP_USER_AGENT']);
 $userFingerprint = md5($browser . $ip);
 if ($_COOKIE['userdata'] != $userFingerprint) {
    header("HTTP/1.1 403 Forbidden");
    exit;
 }
 do_the_byte_range_stuff();
?>

Ho usato MD5, perché non mi importa delle collisioni qui, voglio solo un hash veloce. Puoi andare in overkill e impiegare BCrypt o PBKDF2, ma assolutamente non devi.

    
risposta data 27.01.2016 - 13:38
fonte

Leggi altre domande sui tag