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
Care tag adauga rand nou in paragraf?
<b> <br> <p>
Prima linie ...<br>
Alta linie...
Ce proprietate CSS seteaza spatiu dintre litere?
text-size word-spacing letter-spacing
#id {
  letter-spacing: 2px;
}
Ce functie obtine accesul la un element HTML cu un anumit ID?
getElementById() getElementsByTagName() createElement()
var elm = document.getElementById("theID");
var content = elm.innerHTML;
alert(content);
Clic pe instructiunea "echo" utilizata corect.
echo "CoursesWeb.net" echo "CoursesWeb.net"; echo ""CoursesWeb.net";
echo "Adresa URL: http://CoursesWeb.net";
Care din urmatoarele expresii cu "paint" (a picta) se foloseste pentru forma Negativa?
will paint not paint have painted
She does not paint that landscape.
- Ea nu picteaza acel peisaj.
Care din urmatoarele expresii cu "cantar" (a canta) se foloseste pentru propozitie Negativa?
ir a cantar cantaba no cantar
Ella no canta esa canción.
- Ea nu canta acel cantec.
Blocare Acces Extern la fisiere Video si Audio / Hotlinking

Last accessed pages

  1. Prezent perfect si Prezent perfect continuu - Present perfect and Continuous (46034)
  2. Blog si Cugetari Personale (9553)
  3. Viitor simplu si continuu - Future Tense Simple and Continuous (23860)
  4. Curs si Tutoriale JavaScript (22170)
  5. Verbe modale - SHALL, SHOULD, OUGHT TO, WILL, WOULD, USED TO, BE TO, DARE (16634)

Popular pages this month

  1. Cursuri si Tutoriale: Engleza, Spaniola, HTML, CSS, Php-Mysql, JavaScript, Ajax (6211)
  2. Curs HTML gratuit Tutoriale HTML5 (5218)
  3. Curs si Tutoriale JavaScript (4605)
  4. Curs PHP MySQL, Tutoriale si Scripturi PHP (4499)
  5. Curs CSS Online Tutoriale CSS3 (4335)