Un saludo a toda la comunidad, esta es una interrogante que nació a partir de esta otra pregunta (resuelta) en otro hilo:
http://entredesarrolladores.com/5256/es-posible-transmitir-un-video-de-esta-forma-con-php
A modo de resumen es lo siguiente:
Cuento con un reproductor web (jwplayer) el cual se me encargó proteger para evitar que el video que se va a transmitir pueda ser descargado desde el servidor (o al menos hacerlo lo más difícil posible). La solución pasó en transmitir el flujo de datos multimedia a través de un archivo .php (video.php) y no desde un .mp4 o una extensión similar, así en en index.php que es donde se llama jwplayer se crea un token de verificación y este luego se valida y desecha en video.php, y de este modo el link del video es de un solo uso hasta que se vuelva a recargar la página.
El problema está en que el link a video.php junto a su token son visibles desde el código fuente de index.php y entonces únicamente basta con no darle play al video y luego copiar el link en el navegador para poder descargar el contenido. Entonces lo que busco es una forma de evitar que video.php pueda ser llamado directamente desde el navegador.
En el otro hilo, Leonardo me brindó la siguiente solución:
// Verifica que el llamador sea únicamente $referer
$refererArray = explode('?', basename($_SERVER['HTTP_REFERER']));
$referer = $refererArray[0];
if($referer != 'tu_script_que_llama_al_video.php')
{ die("Llamada incorrecta (X)"); }
El problema está en que con esa condición por alguna razón el video solo logra transmitirse en Chrome y Firefox pero no en ningún otro navegador, ya sea de escritorio o móvil.
Entonces yo intenté relajar más la restricción y al menos evitar que el archivo php pudiera ser llamado directamente (aunque no se verificara desde dónde era llamado) de la siguiente forma:
$referer = $_SERVER['HTTP_REFERER'];
if(!is_null($referer)) {
...El código
}
Y así al menos logro que el video se muestre en los navegadores de escritorio, pero no en los navegadores de dispositivos móviles.
Pensé entonces en intentar validar "video.php" para que solo pudiera ser llamado por el mismo servidor de la siguiente forma:
if ($_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR']) {
... El código para transmitir el video.
}
Y así evitar que pudiera ser llamado directamente, pero al parecer entendí mal el funcionamiento porque la condición no se cumple aunque "video.php" sea llamado desde index.php por medio del reproductor.
Y la única forma que logro que el reproductor trabaje bien en todo tipo de navegador, es eliminando por completo cualquier restricción en video.php.
El contenido html de index.php es el siguiente:
<html>
<head>
<script src="jwplayer-6/jwplayer.js"></script>
<script>jwplayer.key="N6msPwo6K+7NU4s2Ucw1GamiGTGyRF45QdYWnw==";</script>
</head>
<body>
<div id="secureplayer">Cargando el reproductor...</div>
<script type="text/javascript">
jwplayer("secureplayer").setup({
width: '100%',
aspectratio: '16:9',
playlist: [{
sources: [{
file: "video.php?token=04238c2d5daecb34bb481114b20ea368",
type: "video/mp4"
}],
}]
});
</script></body>
</html>
¿Alguna idea para lograr proteger video.php de las llamadas directas? Gracias de antemano.