Gå til innhold

Link til å virke kun en gang.


Anbefalte innlegg

*Denne ligger også under html, men fikk et tips om at den bør ligge her.*

 

Hei.

Jeg har ikke så veldig mye erfaring, men har puslet litt med php og sql.

 

Det jeg er på jakt etter er et script eller et tips til hvordan jeg kan få en link til å virke kun engang.

Nærmere forklart: Jeg skal legge ut et filmklipp på min server. Linken til dette filmklippet skal jeg sende til en bekjent. Han skal kunne klikke på linken, se filmen og så skal linken ikke være gyldig mer. Det skal heller ikke gå å laste ned denne filmen.

Jeg vet ikke om det er mulig, men er det noen der ute som har en løsning?

Lenke til kommentar
Videoannonse
Annonse

Gjør sånn:

- Log IP'n til alle som har brukt linken og putt det i en database

- Sjekk om IP'n ligger i database før man tillater nedlasting av filmen

 

Noe sånt:

<php
$res = $db->query("SELECT * FROM log WHERE ip = '%s'", $_SERVER['REMOTE_ADDR']));
if($res->num_rows > 0) {
 die('No access!');
}
$db->query("INSERT INTO log ('%s')", $_SERVER['REMOTE_ADDR']));
echo file_get_contents('movie.mpeg');
?>

Lenke til kommentar

Og sleng en .htaccess-fil som hindrer http-tilgang til mappen der filmene ligger.

Systemet vil aldri være 100% sikkert, ettersom IP'er forandrer seg (dog sjeldnere enn før), eller man kan bruke proxyer, men det hindrer nok en del mindre tekniske brukere.

Lenke til kommentar
Gjest Slettet-rXRozPkg

Dropp IP.

 

Bruk heller en unik ID. Linken man sender ut inneholder denne ID'en, og når lenken blir åpnet, registrerer du at video x med ID y er åpnet, og setter denne som vist i en database (og eventuellt sletter filen i tillegg). I det samme scriptet legger du til logikk for å sjekke om en video allerede er vist eller ikke.

 

Dette krever altså tilgang til en database... det kan sikkert gjøres med tekstfiler/flatfiler også, men database er det som er best egnet.

Lenke til kommentar

Hmm... Du kan jo gjoere foelgende:

Naar en person sender linke til en annen genereres det en hash av noe slag som lagres i en database med en column som gir filnavnet. Denne hashen legges til paa slutten av linken som sendes.

Personen klikker paa linken, siden han kommer inn paa sjekker gjennom databasen etter en entry med hashstringen. Scriptet aapner filen som hashstringen viser til, og sletter deretter entrien.. Hvis siden ikke finner noen entry med hashkeyen som brukeren oppgir faar han ikke se noen video...

 

EDIT: Aaargh, slaatt paa maalstreken... Jaja, her kommer ihvertfall en begynnelse paa kode :)

 

send_link.php

PHP

<?php

$mailto addslashes(htmlentities($_POST['mottaker']));

$fil addslashes(htmlentities($_POST['fil']));

$hash md5(crypt(md5('LH73hLIUH398y9'), md5('ai5128746gjsv')));

mysql_connect($dbaddr$dbuser$dbpass);

mysql_query(sprintf("INSERT INTO validhashes (hash, file) VALUES ('%s', '%s')"$hash$fil));

mail ($mailto"Anbefalt fil"'En venn av deg har foreslaatt foelgende fil! <a href="http://www.yourpage.com/showfile.php?hash='.$hash.'">Klikk her</a>' );

?>

 

showfile.php

PHP

<?php

mysql_connect($dbaddr$dbuser$dbpass);

$backer mysql_query("SELECT * FROM validhashes WHERE hash='".mysql_real_escape_string($_GET['hash'])."'");

$fileinfo mysql_fetch_array($backer);

$filnavn $fileinfo['fil'];

 

//Her skriver du ut koden som embedder videoen... Filnavnet er lagret i variablen $filnavn

?>

Endret av Jonhoo
Lenke til kommentar

Aesj, faar ikke redigert PHP koden over... Merkelig forum...

Uansett, etter linjen:

PHP
$backer = ....

skal det staa:

PHP
mysql_query("DELETE FROM validhashes WHERE hash='".mysql_real_escape_string($_GET['hash'])."'");

 

Jeg vet at koden ikke er perfekt, men den gir deg ihvertfall en ide om hvordan du kan gjoere det :)

Lenke til kommentar

Kan være en feil i skriptet som fører til det, prøv å sett dette øverst etter <?php:

ini_set("display_errors", 1);

 

Men, hva hindrer brukeren i å linke direkte til donald.avi i ettertid da? ;)

Har selv slitt med samme problem, altså unngå at videoer inkluderes direkte på andre nettsider.... For har han først åpnet siden, så kan han jo se i kilden hva filen heter...

 

Jeg har løst problemet med å rename filen til f.eks "donald_md5-hash-her.avi" og md5-hashen er en sammensetning av verdier fra "date" og et salt. Pr i dag vil det si at den første til å åpne siden med videoen hver uke trigger en renaming av video-filen. ;)

Den finner videofilen ved at jeg spesifiserer at den starter med "donald_" og den returnerer da hele filnavnet til den filen som matcher. ;)

 

Kan poste scriptet om interesse, dere kan forøvrig se det i bruk her:

http://hjelpekorps.steinkjer-rk.no/video/

Endret av ZoRaC
Lenke til kommentar
Gjest Slettet-rXRozPkg
Men, hva hindrer brukeren i å linke direkte til donald.avi i ettertid da? ;)

Har selv slitt med samme problem, altså unngå at videoer inkluderes direkte på andre nettsider.... For har han først åpnet siden, så kan han jo se i kilden hva filen heter...

 

Jeg har løst problemet med å rename filen til f.eks "donald_md5-hash-her.avi" og md5-hashen er en sammensetning av verdier fra "date" og et salt. Pr i dag vil det si at den første til å åpne siden med videoen hver uke trigger en renaming av video-filen. ;)

Den finner videofilen ved at jeg spesifiserer at den starter med "donald_" og den returnerer da hele filnavnet til den filen som matcher. ;)

 

Et forslag som er noe ryddigere (altså med tanke på filnavn) er å ikke laste opp filen rett i eller under html-roten.

 

F.eks.: La oss si at html-roten er /home/users/superduperuser/www/, isteden for å laste opp hit, laster man opp filmene til /home/users/superduperuser/filmer/

 

Man legger så til at scriptet, f.eks. hentfil.php i /www/ som leser filene fra ../filmer/ og streamer det ut til nettleseren.

 

I denne legger man selvsagt inn sjekken på at det finnes en gyldig hash før man streamer filen. Finnes den ikke, så sender man enkelt og greit en 404 header.

 

I scriptet som skal vise videoen/lenken til videoen, så lager man link til hentfil.php?hash=blablabla

 

På denne måten slipper man at noen kan linke direkte til donald.avi.

 

Funksjoner/lenker for å få dette til:

http://no.php.net/readfile

http://no.php.net/header

http://www.faqs.org/rfcs/rfc2183

http://www.utoronto.ca/ian/books/html4ed/appb/mimetype.html

Endret av Slettet-rXRozPkg
Lenke til kommentar

Slik ser filene mine ut nå.

<?php
ini_set("display_errors", 1);
$dbaddr = localhost
$dbuser = ******
$dbpass = ******
$mailto = addslashes(htmlentities($_POST['[email protected]']));
$fil = addslashes(htmlentities($_POST['donald.avi']));
$hash = md5(crypt(md5('LH73hLIUH398y9'), md5('ai5128746gjsv')));
mysql_connect($dbaddr, $dbuser, $dbpass);
mysql_query(sprintf("INSERT INTO validhashes (hash, file) VALUES ('%s', '%s')", $hash, $fil));
mail ($mailto, "Anbefalt fil", 'En venn av deg har foreslaatt foelgende fil! <a href="http://www.mittdomene/showfile.php?hash='.$hash.'">Klikk her</a>' );
?>

Og sendfile.php ser slik ut:

<?php
ini_set("display_errors", 1);
$dbaddr = localhost
$dbuser = ******
$dbpass = *****
mysql_connect($dbaddr, $dbuser, $dbpass);
$backer = mysql_query("SELECT * FROM validhashes WHERE hash='".mysql_real_escape_string($_GET['hash'])."'");
mysql_query("DELETE FROM validhashes WHERE hash='".mysql_real_escape_string($_GET['hash'])."'")
$fileinfo = mysql_fetch_array($backer);
$filnavn = $fileinfo['donald.avi'];

//Her skriver du ut koden som embedder videoen... Filnavnet er lagret i variablen $filnavn
?>

 

Det er ikke store forandringene jeg har gjort.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...