Gå til innhold

Link til å virke kun en gang.


Anbefalte innlegg

Skrevet

*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?

Videoannonse
Annonse
Skrevet

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');
?>

Skrevet

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.

Skrevet

Her snakker vi ikke om avansert sikkerthet, for da er ikke IP nok. Vis jeg vil så har jeg nye IP på et minutt så det hjelper deg ikke mye mot de som virkelig vil ha filmen 2 ganger. Men de vel isåfall lagre filmen :p

Gjest Slettet-rXRozPkg
Skrevet

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.

Skrevet (endret)

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
Skrevet

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 :)

Skrevet

Jeg synes dette hørtes ut som en grei løsning.

Men jeg skjønner at jeg kan alt for lite programmering.

Er det noen som har enormt lyst til å hjelpe?

Skrevet

Har jo nettopp skrevet mange linjer kode over jo ^^

Det skal vaere akkurat det du trenger...

 

Hvis du gir oss lit mer informasjon saa kan vi sikkert hjelpe deg aa skreddersy noe kode som er paste-n-run... :)

Skrevet

Vel, skal forsøke.

Jeg har webhotell via one.com.

Jeg skal sende en link (pr mail) til en film som jeg legger ut via ftp.

For moro skyld kan vi kalle filmen donald.avi

 

Fortell meg mer hva du trenger.

Skrevet

Altsaa, alt du trenger aa gjoere er aa copy-paste koden over, legge inn mysql brukernavn og passord og legge inn html koden for aa embede video etter linjen

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

Skrevet

Men når jeg forsøker så er siden helt blank.

Dette gjelder både send_link.php og showfile.php

 

Har selvfølgelig forandret adresse og lagt inn db informasjonen.

Skrevet (endret)

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
Gjest Slettet-rXRozPkg
Skrevet (endret)
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
Skrevet
*snip*

 

Prøvde noe slikt selv også, men måtte tilslutt gi opp.

Vet ikke helt hvorfor, men den ene videofilen er nesten 50MB, så mistenker at filen ble for stor til at det kunne løses slik...

 

Om noen får til dette vil jeg gjerne se koden :)

Skrevet

Skulle gjerne fått til noe av det som Jonhoo skriver ovenfor.

Men når jeg kjører de så blir det bare blank skjerm. Kommer ingen feilmld heller.

Skrevet

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.

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...