Cand aveti continut video si /sau audio, altcineva poate lua filmul sau muzica in site-ul lui direct folosind adresa URL a acelor fisiere. Aceasta practica urata are denumirea generica de hotlinking. Profita de latime de banda a site-ului dv. Deoarece continutul e luat direct de pe serverul dv., de fiecare data cand se incarca fisierul in site-ul lui, consuma traficul dv. (latimea de banda).
Acest tutorial va arata cum puteti sa preveniti hotlinking / sa blocati accesul extern la fisierele video si audio folosind ".htaccess" si PHP.
- Ideea prezentata in acest tutorial este modificarea frecventa, automat a denumirii directoarelor in care sunt acele fisiere.

• Ca sa descarcati fisierele si exemplu cu codurile prezentate mai jos, clic: Prevenire Hotlinking.

Mai intai se creaza un cod in ".htaccess" care sa permita accesul la anumite fisiere numai de pe site-ul dv. si fara referer (asta deoarece Mozilla Firefox nu trimite informatii de referer), si redirectioneaza adresa URL a acelor fisiere la un script PHP.

Cod pentru .htaccess ca sa previna hotlinking video si audio

RewriteEngine On

# seteaza referer permis. Inlocuiti "marplo.net" cu numele domeniului site-ului dv.
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?marplo.net [NC]
RewriteRule .(flv|mp4|ogg|mp3) / [NC,L]

# Redirect URL la scriptul PHP, pt. fisierele cu extensia de mai sus
RewriteRule ^(vi|au)_([^\.]+\.(flv|mp4|ogg|mp3))$ redirect_va.php?fn=$2&tp=$1 [NC,L]

# Blocare acces extern la dirsuffix.txt
<files dirsuffix.txt>
 order allow,deny
 deny from all
</files>

- Linia 4 ( RewriteCond %{HTTP_REFERER} !^$ ) – Permite referer gol.
- Linia 5 – Site permis ca sa acceseze fisierele (aici marplo.net), inlocuiti cu numele de domeniu al site-ului dv.
- Linia 6 – Extensiile fisierelor ce trebuie blocate. Intre parantezele rotunde () sunt extensiile ce trebuie blocate. Ca sa adaugati altele, separati-le cu "|".
- Urmatoarea linie redirectioneaza adresa URL la "redirect_va.php", cu numele fisierului si tipul ("vi" indice pt. video, sau "au" pt. audio).
- Ultimele linii blocheaza accesul extern la "dirsuffix.txt", un fisier in care e retinut sufixul (modificat frecvent) pt. numele directoarelor in care sunt fisierele video si audio.

- Ca sa fiti mai sigur/a ca acele fisiiere pot fi accesate numai din site-ul dv., e bine sa folositi sesiune. Daca pagina cu player-ul video sau audio e generata cu un fisier .php, adaugati urmatorul cod la inceputul acelui fisier, ca sa fie creata o variabila de sesiune ce va fi verificata in "redirect_va.php" (dupa cum puteti vedea adaugat in "index.php", in arhiva de la link-ul de download de mai sus).
session_start();
$_SESSION['getva'] = '1';

Scriptul PHP

Creati pe server un fisier PHP denumit "redirect_va.php", in acest fisier scriem codul PHP care modifica frecvent (60 minute) numele directoarelor ce contin fisierele video si audio, apoi face redirect la fisierul solicitat.
In acelasi director creati un fisier text, denumit "dirsuffix.txt". In acest fisier e inregistrat sufixul folosit la formarea numelui directorului, si Timestamp (timpul Unix) cand numele a fost modificat (mai multe explicatii sunt in comentariile din cod).

PHP trebuie sa aibe permisiuni de scriere pe server, ca sa poata scrie date in fisierul "dirsuffix.txt", si sa modifice numele directoarelor.

Code for redirect_va.php

<?php
// Prevenire Hotlinking video /audio - marplo.net/php-mysql/
session_start();

$fstore = 'dirsuffix.txt';       // fisier de inregistrare: sufix^timestamp
$base_dir_vi = 'video';          // nume de baza pt. directorul cu fisiere video
$base_dir_au = 'audio';          // nume de baza pt. directorul cu fisiere audio

// array with valori folosite pt. modificare nume director
$suffix = array('xyz5', 'de18', 'ab85', 'ju7k', 'w2er', 'hws8', 'bnji', 'hgdmar');

// verifica daca sesiunea "getva" exista, si URL cu GET "fn" si "tp" (redirectionate din .htaccess)
if(isset($_SESSION['getva']) && isset($_GET['fn']) && isset($_GET['tp'])) {
  // sterge tag-urile din datele GET, si preia numele si indiciul pt. tip fisier
  $_GET = array_map("strip_tags", $_GET);
  $fname = trim($_GET['fn']);
  $ftype = trim($_GET['tp']);

  // obtine baza pt. numele directorului, pt. video sau audio, in functie de $ftype
  $dir = ($ftype == 'vi') ? $base_dir_vi : $base_dir_au;

  // citeste fisierul TXT, separa sufixul si timestamp
  $ardata = file($fstore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  $pf_tm = explode('^', $ardata[0]);
  $sfx = $pf_tm[0];

  // daca datele sunt mai vechi de 60 min, alege aleator un nou sufix ca sa formeze numele directorului
  if(($pf_tm[1] + 3600) < time()) {
    $isf = array_rand($suffix, 1);
    $sfx = $suffix[$isf];
    if($sfx == $pf_tm[0]) $sfx = 'files';         // daca e acelasi sufix, seteaza 'files'

    // inregistreaza noul sufix^timestamp in fisierul TXT
    if(file_put_contents($fstore, $sfx.'^'.time())) {
      // verifica daca directoarele pt. video si audio exista, si le redenumeste
      if(is_dir($base_dir_vi.$pf_tm[0])){
        rename($base_dir_vi.$pf_tm[0], $base_dir_vi.$sfx);
      }
      if(is_dir($base_dir_au.$pf_tm[0])){
        rename($base_dir_au.$pf_tm[0], $base_dir_au.$sfx);
      }
    }
  }

  header('Location: '. $dir.$sfx. '/'. $fname);          // redirect la fisierul solicitat
}
?>

IMPORTANT :
1) Initial, numele directoarelor pentru fisierele video si audio trebuie sa fie: videofiles, respectiv audiofiles, cu sufixul "files" (deoarece numele directorului e format din baza (audio sau video) si sufixul inregistrat in "dirsuffix.txt" (initial "files")).
Daca doriti sa folositi alt nume /baza pt. aceste directoare, modificati in "redirect_va.php", valoarea variabilelor: $base_dir_vi si $base_dir_au.

2) Ca sa poata face diferenta dintre cererea de accesare fisier video sau audio in ".htaccess" si "redirect_va.php", folositi in player-ul dv. aceste prefixe la numele fisierului: "vi_" pt. video, si prefixul "au_" pt. audio, precum in aceste exemple.
- Pentru video:
<video controls="controls"width="200" height="150">
 <source src="vi_video_filename.mp4" type="video/mp4" />
 <source src="vi_video_filename.ogg" type="video/ogg" />
 Brovser-ul dv. nu recunoaste tag-ul video,
 <a href="vi_video_filename.mp4">Descarcati fisierul</a>.
</video>

- Pentru audio:
<audio controls="controls">
 <source src="au_audio_filename.ogg" type="audio/ogg" />
 <source src="au_audio_filename.mp3" type="audio/mp3" />
 Brovser-ul dv. nu recunoaste tag-ul audio,
 <a href="au_audio_filename.mp3">Descarcati fisierul</a>.
</audio>
Aceste prefixe trebuie adaugate doar la numele fisierului in player, nu la fisiere pe server. Numele fisierului pe server va fi, de exemplu: "video_filename.mp4", fara "vi_".

Observati ca numele directorului nu e adaugat in player, astfel, utilizatorul nu poate vedea locatia fisierelor. .htaccess va face redirect la scriptul PHP ("redirect_va.php"), care va redirectiona catre locatia fisierului.


• Daca in pagina cu player-ul nu puteti folosi Sesiuni (de exemplu, fiindca e fisier ".html"), scrieti acest cod in "redirect_va.php" (ca sa nu lucreze cu session). Dar serverul trebuie sa ruleze PHP.
<?php
// Prevenire Hotlinking video /audio - marplo.net/php-mysql/

$fstore = 'dirsuffix.txt';       // fisier de inregistrare: sufix^timestamp
$base_dir_vi = 'video';          // nume de baza pt. directorul cu fisiere video
$base_dir_au = 'audio';          // nume de baza pt. directorul cu fisiere audio

// array with valori folosite pt. modificare nume director
$suffix = array('xyz5', 'de18', 'ab85', 'ju7k', 'w2er', 'hws8', 'bnji', 'hgdmar');

// verifica daca exista URL cu GET "fn" si "tp" (redirectionate din .htaccess)
if(isset($_GET['fn']) && isset($_GET['tp'])) {
  // sterge tag-urile din datele GET, si preia numele si indiciul pt. tip fisier
  $_GET = array_map("strip_tags", $_GET);
  $fname = trim($_GET['fn']);
  $ftype = trim($_GET['tp']);

  // obtine baza pt. numele directorului, pt. video sau audio, in functie de $ftype
  $dir = ($ftype == 'vi') ? $base_dir_vi : $base_dir_au;

  // citeste fisierul TXT, separa sufixul si timestamp
  $ardata = file($fstore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  $pf_tm = explode('^', $ardata[0]);
  $sfx = $pf_tm[0];

  // daca datele sunt mai vechi de 60 min, alege aleator un nou sufix ca sa formeze numele directorului
  if(($pf_tm[1] + 3600) < time()) {
    $isf = array_rand($suffix, 1);
    $sfx = $suffix[$isf];
    if($sfx == $pf_tm[0]) $sfx = 'files';         // daca e acelasi sufix, seteaza 'files'

    // inregistreaza noul sufix^timestamp in fisierul TXT
    if(file_put_contents($fstore, $sfx.'^'.time())) {
      // verifica daca directoarele pt. video si audio exista, si le redenumeste
      if(is_dir($base_dir_vi.$pf_tm[0])){
        rename($base_dir_vi.$pf_tm[0], $base_dir_vi.$sfx);
      }
      if(is_dir($base_dir_au.$pf_tm[0])){
        rename($base_dir_au.$pf_tm[0], $base_dir_au.$sfx);
      }
    }
  }

  header('Location: '. $dir.$sfx. '/'. $fname);          // redirect la fisierul solicitat
}
?>

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Ce tip de <input> creaza o paleta de culori pentru selectare culoare?
type="text" type="color" type="date"
<input type="color" name="get_color" />
Care metoda CSS roteste elementul HTML la un anumit numar de grade?
scale() translate() rotate()
#some_id:hover {
  transform: rotate(60deg);
  -ms-transform: rotate(60deg);    /* IE 9 */
  -moz-transform: rotate(60deg);   /* Firefox */
}
Click pe functia care returneaza numarul cel mai mare.
pow() min() max()
var maxn = Math.max(8, 4, 88, 56);
alert(maxn);      // 88
Ce functie previne ca un fisier sa fie inclus mai mult de o data intr-o pagina?
include() include_once() require()
include_once("un_fisier.php");
Care este traducerea corecta pentru: "Ahead of time"?
Peste timp La timp Inainte de vreme
Most people arrived ahead of time.
- Cei mai multi oameni au sosit inainte de vreme (prea devreme).
Indicati traducerea corecta a cuvantului "buenísimo"
mai bun mai putin bun extrem de bun
Este fruto es buenísimo.
- Acest fruct este extrem /nemaipomenit de bun.
Blocare Acces Extern la fisiere Video si Audio / Hotlinking

Last accessed pages

  1. Gramatica limbii engleze - Prezentare Generala (113531)
  2. Blog si Cugetari Personale (3309)
  3. Pronumele in limba engleza - Pronouns (20929)
  4. Prepozitii - Prepositions (12202)
  5. Verbele in limba engleza - Verbs (18963)

Popular pages this month

  1. Cursuri si Tutoriale: Engleza, Spaniola, HTML, CSS, Php-Mysql, JavaScript, Ajax (2242)
  2. Curs HTML gratuit Tutoriale HTML5 (1614)
  3. Curs si Tutoriale JavaScript (1589)
  4. Curs PHP MySQL, Tutoriale si Scripturi PHP (1544)
  5. Curs CSS Online Tutoriale CSS3 (1416)