/**
Esto creara una funcion generica que validara la fecha, dispositivo del usuario, navegador, ip, fecha de caducidad y demas
La funciones Decrypt debe ser creada y pasarla como JSON PARSE
*/
/** DRM */
function created_uri($contentShow, $data)
{
$allowed = isset($_SERVER['HTTP_X_ALLOWED']) ? $_SERVER['HTTP_X_ALLOWED'] : false;
$content = isset($_SERVER['HTTP_X_CONTENT']) ? $_SERVER['HTTP_X_CONTENT'] : false;
if ($allowed and $content) {
/** Firma */
$sig = isset($data['sig']) ? $data['sig'] : false;
if ($sig) {
$signature = json_decode(Decrypt($sig));
$method = $signature->encrypted;
/** Permitido */
$authenticated = true;
/** exp */
$exp = isset($method->expire) ? $method->expire : false;
if (strtotime('now') >= $exp) {
$authenticated = false;
}
/** ei */
$ei = isset($method->ei) ? base64_decode($method->ei) : false;
if (helper_user_agent() != $ei) {
$authenticated = false;
}
/** ip */
$ip = isset($method->ip) ? $method->ip : false;
if (helper_user_ip() != $ip) {
$authenticated = false;
}
/** id */
$id = isset($method->id) ? $method->id : false;
if ($content != $id) {
$authenticated = false;
}
/** Acceso */
if ($authenticated) {
return $contentShow;
} else {
exit('{[Error.401]}');
}
} else {
exit('{[Error.400]}');
}
} else {
exit('{[Error.400]}');
}
}
/*
Lo siguiente es para utilizar los metodos created_uri()
*/
/** Tiempo */
$iat = time();
$exp = $iat + (60 * 1);
/** Firma */
$sig = array(
'iat' => $iat,
'exp' => $exp,
'encrypted' => [
'expire' => $exp,
'ei' => base64_encode( helper_user_agent() ),
'ip' => helper_user_ip(),
'id' => 'Identificador del video ej: 1',
'itag' => 'default',
'source' => getenv('APP_NAME'),
'mime' => 'application/x-mpegURL',
'clen' => 'Segundos del video/content',
'lmt' => $iat,
'sparams' => 'expire,ei,ip,id,itag,source,mime,clen,dur,lmt'
]
);
/*
El metodo Encrypt debe ser creada y pasarla como JSON PARSE
*/
/** Firma protegida */
$tplSig = Encrypt(json_encode($sig));
$urlSig = http_build_query($sig['encrypted']);
/** Firma Creada */
$signature = '?' . urldecode ( $urlSig ) . '&sig=' . $tplSig;
/*
Enviando los parametros
*/
/** La firma debe pasar de la siguiente forma */
$uri = '/streamingProgressive/' . $slug . $signature;
/*
Adicionalmente debe enviar varios parametros por los HEADER
Asi evitara el uso de hotlinking fake IP / referrer
*/
/*
Esto debe ser enviado en los Header's de su soliictud a la url
streamingProgressive
xhr.setRequestHeader('X-content', '<?php echo $sig['encrypted']['id']; ?>');
xhr.setRequestHeader('X-allowed', '<?php echo $sig['encrypted']['itag']; ?>');
*/
/*
Funciones genericas que se usan
*/
/** Metodo para la IP del usuario */
function helper_user_ip()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
//check ip from share internet
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
//to check ip is pass from proxy
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (!empty($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = null;
}
return $ip;
}
/** Metodo para obtener el agent del usuario */
function helper_user_agent()
{
if (!empty($_SERVER['HTTP_USER_AGENT'])) {
//check ip from share internet
$agent = $_SERVER['HTTP_USER_AGENT'];
} else {
$agent = null;
}
return $agent;
}
/**
Analizando las URL'S y entiendo el proceso realizado
*/
/**
https://videos.com/videoplayback/1?expire=1576342267&ei=TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc4LjAuMzkwNC4xMDggU2FmYXJpLzUzNy4zNg==&ip=127.0.0.1&id=1&itag=default&source=Video&mime=application/x-mpegURL&clen=6932456&lmt=1576342207&sparams=expire,ei,ip,id,itag,source,mime,clen,dur,lmt&sig=eUFOVng2T2N2MFFZUFVHMDd6ZnVuZU1PUFBmNEE5TDFEN2JmWitQSFBGSTdCZ2VhZGlrTlBqVXQyQ2ptTWJMcC9YS0ZrZ3FTVkdkYTIvTERRTG8wWjY5cE9qMnVCYlhPQWNkcnJQcmxVYkVCR3lhSTcvMUxmRnpaTWVpcFNyYnpDVTZsa1FiZjFaanpUbklnOTVlS0pkNjRoVXlCNlRhY2dBR2ZRSloxYW9YN3YzVFI0WVpyVUFQYzM3ZnhXRU4yMUYrNE4yZFNEbW84NkJ0Sm56Z0xjMzFxaHNUbUF6T0gzeHg2Q1dWaWdOcWp6SVFSQ3ROaWJlVzB2aCt6SktOVDVVMXZybUtDakEvT0VFenEwUmVvc1FHWE9YeS9VZEs0UkVpS3ZLbjdCYXBEaUMxaTF3YXRzbjQ2WDAwUWx5cU8zVmhyUUFTNnU0THdvQ2NSNnkwaVY3S1Q4aSthbHpSdGJSbFZkc0phTGI2alJJVVB2Z0Z0WEx6V3JIalc4bXl2RzBQOFRvRXRVMXJKdzBSTS9mUW5TNXY4cHhFOVJPdTA4ajRCWFFoeWlYQ3g4bTJTZ3V4ZmdFY1BQaHB2bXVISEF0N3RlckxuNlhIUkVZZkoyRllXekpWS1RKL2czTWpreXQ3Vyt5aEZ4U2NTN01Td09remRwam90N1psQXQ4dVNtQ0ZPa0VtQ0RGOWpDWkdaY0VoS3Z1ZXIvVU15aVp1WDVyVlFWRWhxcW1rQ0FURy9QK1lrVjg1TjNONmpQU0FYT0ZNUVVheGxzYStSeU53ZHBjbUFRdz09
URL PARTS
Scheme:
https
Protocol:
https
Authority:
videos.com
Host:
videos.com
Hostname:
videos.com
Domain:
videos.com
Tld:
com
Resource:
/videoplayback/1?expire=1576342267&ei=TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc4LjAuMzkwNC4xMDggU2FmYXJpLzUzNy4zNg==&ip=127.0.0.1&id=1&itag=default&source=Video&mime=application/x-mpegURL&clen=6932456&lmt=1576342207&sparams=expire,ei,ip,id,itag,source,mime,clen,dur,lmt&sig=eUFOVng2T2N2MFFZUFVHMDd6ZnVuZU1PUFBmNEE5TDFEN2JmWitQSFBGSTdCZ2VhZGlrTlBqVXQyQ2ptTWJMcC9YS0ZrZ3FTVkdkYTIvTERRTG8wWjY5cE9qMnVCYlhPQWNkcnJQcmxVYkVCR3lhSTcvMUxmRnpaTWVpcFNyYnpDVTZsa1FiZjFaanpUbklnOTVlS0pkNjRoVXlCNlRhY2dBR2ZRSloxYW9YN3YzVFI0WVpyVUFQYzM3ZnhXRU4yMUYrNE4yZFNEbW84NkJ0Sm56Z0xjMzFxaHNUbUF6T0gzeHg2Q1dWaWdOcWp6SVFSQ3ROaWJlVzB2aCt6SktOVDVVMXZybUtDakEvT0VFenEwUmVvc1FHWE9YeS9VZEs0UkVpS3ZLbjdCYXBEaUMxaTF3YXRzbjQ2WDAwUWx5cU8zVmhyUUFTNnU0THdvQ2NSNnkwaVY3S1Q4aSthbHpSdGJSbFZkc0phTGI2alJJVVB2Z0Z0WEx6V3JIalc4bXl2RzBQOFRvRXRVMXJKdzBSTS9mUW5TNXY4cHhFOVJPdTA4ajRCWFFoeWlYQ3g4bTJTZ3V4ZmdFY1BQaHB2bXVISEF0N3RlckxuNlhIUkVZZkoyRllXekpWS1RKL2czTWpreXQ3Vyt5aEZ4U2NTN01Td09remRwam90N1psQXQ4dVNtQ0ZPa0VtQ0RGOWpDWkdaY0VoS3Z1ZXIvVU15aVp1WDVyVlFWRWhxcW1rQ0FURy9QK1lrVjg1TjNONmpQU0FYT0ZNUVVheGxzYStSeU53ZHBjbUFRdz09
Directory:
/videoplayback
Path:
/videoplayback/1
File name:
1
Query string:
expire=1576342267&ei=TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc4LjAuMzkwNC4xMDggU2FmYXJpLzUzNy4zNg==&ip=127.0.0.1&id=1&itag=default&source=Video&mime=application/x-mpegURL&clen=6932456&lmt=1576342207&sparams=expire,ei,ip,id,itag,source,mime,clen,dur,lmt&sig=eUFOVng2T2N2MFFZUFVHMDd6ZnVuZU1PUFBmNEE5TDFEN2JmWitQSFBGSTdCZ2VhZGlrTlBqVXQyQ2ptTWJMcC9YS0ZrZ3FTVkdkYTIvTERRTG8wWjY5cE9qMnVCYlhPQWNkcnJQcmxVYkVCR3lhSTcvMUxmRnpaTWVpcFNyYnpDVTZsa1FiZjFaanpUbklnOTVlS0pkNjRoVXlCNlRhY2dBR2ZRSloxYW9YN3YzVFI0WVpyVUFQYzM3ZnhXRU4yMUYrNE4yZFNEbW84NkJ0Sm56Z0xjMzFxaHNUbUF6T0gzeHg2Q1dWaWdOcWp6SVFSQ3ROaWJlVzB2aCt6SktOVDVVMXZybUtDakEvT0VFenEwUmVvc1FHWE9YeS9VZEs0UkVpS3ZLbjdCYXBEaUMxaTF3YXRzbjQ2WDAwUWx5cU8zVmhyUUFTNnU0THdvQ2NSNnkwaVY3S1Q4aSthbHpSdGJSbFZkc0phTGI2alJJVVB2Z0Z0WEx6V3JIalc4bXl2RzBQOFRvRXRVMXJKdzBSTS9mUW5TNXY4cHhFOVJPdTA4ajRCWFFoeWlYQ3g4bTJTZ3V4ZmdFY1BQaHB2bXVISEF0N3RlckxuNlhIUkVZZkoyRllXekpWS1RKL2czTWpreXQ3Vyt5aEZ4U2NTN01Td09remRwam90N1psQXQ4dVNtQ0ZPa0VtQ0RGOWpDWkdaY0VoS3Z1ZXIvVU15aVp1WDVyVlFWRWhxcW1rQ0FURy9QK1lrVjg1TjNONmpQU0FYT0ZNUVVheGxzYStSeU53ZHBjbUFRdz09
Query String
'expire':
1576342267 // Tiempo de vida
'ei': // Navegador
TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc4LjAuMzkwNC4xMDggU2FmYXJpLzUzNy4zNg==
'ip': // Ip del usuario
127.0.0.1
'id':
1 // Recurso solicitado
'itag':
default // Calidad del video
'source':
Video // Fuente donde se solicita (DOMINIO)
'mime':
application/x-mpegURL // Tipo de contenido
'clen':
6932456 // Duracion del video
'lmt':
1576342207 // Fecha de creacion
'sparams':
expire,ei,ip,id,itag,source,mime,clen,dur,lmt // Parametros validados
'sig':
SIGNATURE // Firma que sera validada por el back-end
*/