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 HTML5 adauga o aplicatie externa (SWF, PDF) in pagina web?
<mark> <embed> <canvas>
<embed src="flash_game.swf" width="450" height="350" />
Ce pseudo-element adauga un anume stil la prima linie de text din element?
:first-letter :before :first-line
#id:first-line {
  font-weight: bold;
  color: blue;
}
Clic pe proprietatea obiectului window care preia sau seteaza adresa URL a paginii curente.
window.location window.self window.status
var url = window.location;
alert(url);
Indicati functia PHP care preia continutul unui fisier sau pagina si-l adauga intr-un sir.
fopen() file_put_contents() file_get_contents()
$homepage = file_get_contents("http://www.marplo.net/");
echo $homepage;
Care din urmatoarele perechi de numere sunt in ordine unul dupa altu?
seven - eight ten - six three - five
This fruit has seven or eight seeds.
- Acest fruct are sapte sau opt seminte.
Care din urmatoarele perechi de numere sunt in ordine unul dupa altu?
diez - seis siete - ocho tres - cinco
Esta fruta tiene siete u ocho semillas.
- Acest fruct are sapte sau opt seminte.
Blocare Acces Extern la fisiere Video si Audio / Hotlinking

Last accessed pages

  1. Instructiuni repetitive - FOR (1389)
  2. Substantive - Exercitii si teste engleza incepatori (11892)
  3. Jokes - Glume, Bancuri, Humor (2) (2634)
  4. Adjectivul in limba engleza - The adjective (10581)
  5. Prezentul simplu - Exercitii si teste incepatori (19013)

Popular pages this month

  1. Prezentul simplu si continuu - Present Tense Simple and Continuous (2766)
  2. Cursuri si Tutoriale: Engleza, Spaniola, HTML, CSS, Php-Mysql, JavaScript, Ajax (2257)
  3. Gramatica limbii engleze - Prezentare Generala (2080)
  4. Prezent perfect si Prezent perfect continuu - Present perfect and Continuous (1724)
  5. Trecutul simplu si continuu - Past Tense Simple and Continuous (1440)