View Single Post
Limited edition
Moff's Avatar
PHP-delen av dette er relativt enkel. Det som kompliserer dette er at du ønsker å ta betaling. Dette krever at du integrerer mot en betalingsløsning, som PayPal. Dette fungerer vanligvis slik at du registrerer deg som en bruker av betalingstjenesten, og du gir brukerne dine en link dit hvor de kan betale. Når betalingen er utført så vil betalingsløsningen redirecte brukeren tilbake til siden din, og du bør da helst ha mulighet til å verifisere at brukeren faktisk har betalt. Typisk vil du da kunne kalle noe sånt som paypal.com/har-bruker-betalt/bruker-id (fiktiv lenke), og betalingsløsningen vil da gi deg et svar som du kan stole på at er korrekt (fordi brukeren ikke kan påvirke hva betalingsløsningen svarer).

Aller helst så bør du bruke en database hvor du kan lagre dataene dine. Siden du allerede kan å lage pålogging, så antar jeg at du er kjent med det å opprette databaser med brukere også. Du lager deg en tabell til som holder rede på hvilke brukere som har tilgang til hvilke filmer, med et timestamp for når tilgangen går ut. Det kan se slik ut:

Table users:
id | timestamp | username | password

Table access:
id | timestamp | userid | productid | expires

Table products:
id | timestamp | title | filename

Tabellen users holder på alle brukerne dine. "id" er en int med auto_increment og primary key. "timestamp" er UNIX_TIMESTAMP(), og denne viser deg bare når brukeren ble opprettet. "username" er brukernavnet og "password" er passord-hashen til brukeren.

Tabellen access holder på hvem som har tilgang til hvilke filmer (her kalt produkter - du kan jo i fremtiden leie ut mer enn bare film). "id" og "timestamp" er det samme som i users; auto_increment og UNIX_TIMSTAMP(). Det er alltid lurt å holde track på når en rad ble satt inn, selv om du ikke umiddelbart ser behov for det. Det er vanskelig å legge til dette i etterkant, hvis du plutselig ser at du trenger det. "userid" er en foreign key som peker mot users.id (altså id-en for en brukerkonto). "productid" er en foreign key som peker mot products.id, som er id-en for en film. "expires" er et nytt unix timestamp, men denne genererer du i PHP-koden og setter det til tidspunktet hvor leien skal opphøre (5 dager frem i tid).

Tabellen products holder på filmene dine. "id" og "timestamp" er på nytt bare auto_increment og UNIX_TIMESTAMP(). "title" er tittelen på filmen, som vises til brukerne dine. "filename" er et unikt navn for hver film. Du KAN i teorien bruke "id"-kolonnen til dette, men det er veldig bad practice. Du vil heller bruke en tilfeldig hash av ett eller annet slag, fordi det gjør at brukere ikke kan gjette hvilke hasher som er gyldige. Se for deg at du hadde laget et sosial nettverk (Facebook) og alle profiler hadde vært åpne, og brukt auto_increment som ID-er. Alle brukere kunne da crawlet seg gjennom alle profiler fordi de vet at profilene identifiseres med tall i stigende rekkefølge. På samme måte, hvis noen skulle finne en måte å få tilgang til mappen med filmene dine i, så er det ikke særlig smart at filnavnene heter "1.mp4", "2.mp4" og "3.mp4". Ved å bruke tilfeldige hasher som filnavn så blir det veldig vanskelig å gjette hva filene egentlig heter.

Når brukerne dine er pålogget, så lister du opp alle products.title-rader du har, med en link til betalingsløsningen din. Her må du også angi hvilken bruker det er som betaler, og hva det er de betaler for (users.id og products.id). Når brukeren har betalt, så bruker du det callback-et du har fått fra betalingsløsningen hvor du kan sjekke at brukeren har betalt. Når dette er OK, så lagrer du en ny rad i access, hvor du fyller inn hvilken bruker det er (userid), hvilket produkt det er (productid), og når tilgangen skal utløpe (expires).

Deretter gir du brukeren en link til filmen ved å bruke products.id-feltet (ikke products.filename), så brukeren går inn på en side av typen "dinside.com/produkter/1". Denne siden sjekker om brukeren har tilgang til å se filmen med den angitte ID-en (1), ved å sjekke om access.expires har utgått eller ikke. Hvis alt er OK, så viser du en videospiller med filmen. Som URL for videospilleren så bruker du en lignende URL, for eksempel dinside.com/filmer/1". Dette peker mot et PHP-skript som på nytt sjekker om brukeren har tilgang til filmen (på samme måte som videospiller-siden gjør), og hvis alt er OK, så bruker du header()-funksjonen til å levere selve filmen (mp4-filen), som om man hadde åpnet filmen direkte.

Det du i tillegg må gjøre, som et helt grunnleggende sikkerhetstiltak, er å begrense lesetilgang i mappen hvor filmene ligger, slik at man ikke kan åpne filmene direkte. De fleste webservere vil da tillate lesetilgang fra PHP-skriptene dine (/filmer/1-fila), så den klarer å lese og levere filmen til brukerne som faktisk har tilgang - men så snart tilgangen utløper er brukerne sperret ute.

Man kan fortsatt bruke en addon for å laste ned filmen, fordi innholdet streames til brukerens PC. Du "laster ned" alt du ser på internett uansett om du lagrer det på PC-en din eller ikke, så det er klin umulig å hindre piratkopiering av innhold på nett. Om du gir dem .mp4-linken direkte, så trenger brukerne bare å høyreklikke og velge "lagre som" for å laste ned filmen, og det er så enkelt at alle klarer å gjøre det. Å laste ned for eksempel YouTube-filmer krever bittelitt mer know-how. Ikke mye, men litt.

Hvis du trenger mer konkret informasjon så trenger vi å vite litt om hva slags webserver du bruker og hva slags database du har.