PDA

Bekijk Volledige Versie : Apache http beveiliging dmv cookie



Anoniem
25/08/13, 08:39
Ik ben op zoek naar een linux/apache expert.

Ik wil op een website html5 video bestanden beveiligen met een login en cookies.

Het deel wat ik zelf doe:
Via een php pagina wordt er een cookie aangemaakt met een unieke random sleutel. Deze
sleutel wordt vervolgens samen met een IP adres gecontroleerd in de PostgreSQL database of
deze nog geldig is. Dit gebeurt bIj elke php pagina request.

Bij het volgende deel wil ik graag hulp
Nu wil ik het streamen van video bestanden laten verzorgen door apache via httpd.conf. Als
hiervoor extra modules geïnstalleerd moeten worden is dit geen probleem.

Dit moet als volgt werken, bij een http(s) request moet apache een PL/pgSQL functie
aanroepen* in de postgresql database met de volgende variabelen als input:
- bestandsnaam (incl path)
- ipadres client
- sleutel uit cookie
Deze functie geeft een HTTP status code terug. Deze kan zijn
2xx > client mag toegang tot video bestand
4xx > client mag geen toegang (cookie verlopen, niet ingelogd, onvoldoende permissie etc)

* Het aanroepen gaat als volgt: SELECT http_code FROM apache_auth([FILENAME], [REMOTE_IP],
[COOKIE]);

Vervolgens moet apache bij een 2xx code het video bestand beschikbaar stellen. En bij een
4xx de juiste header en NIET het bestand.

Wie kan me hierbij helpen? Dus de linux server hiervoor in te richten met de juiste httpd
configuratie en eventueel de juiste modules. Ik sta ook open voor andere oplossingen,
als bovenstaande lastig is uit te voeren.

Het idee is dat het uiteindelijk in een handleiding komt te staan.

asusk7m550
25/08/13, 14:36
Is er een reden dat je dit niet door PHP wilt laten doen?

Dit moet volgens mij gewoon te doen zijn.

systemdeveloper
25/08/13, 15:05
Waarom maak je niet gewoon een mod_rewrite regel die requests naar de movies doorstuurt naar een php bestand, dat vervolgens de controle doet op filenaam, ip en cookie en dan gewoon een 4xx of 2xx incl. bestandsnaam teruggeeft?

Anoniem
25/08/13, 17:36
Omdat PHP dan grote GB+ bestanden moet inlezen. Je kunt verwijzen naar bepaalde fragmenten dmv van een timstamp + bestand. Nu kan ik gewoon via javascript de html5 video laten beginnen op dat tijdstip. Als ik dat via PHP doe wordt de hele file gekopieerd naar het geheugen of een temp file. Lijkt me een beetje overbodig.

Voor cookie en postgreSQL: http://authpg.sourceforge.net/
Dan heb je alleen nog het clientIP adres nodig.

systemdeveloper
25/08/13, 18:06
Je moet het niet in php eerst gaan inlezen idd.
De modrewrite gebruik je om de browser request direct op het bestand af te vangen en naar een php script te sturen.
Dit php deel gebruik je alleen om de controle te doen op file, ip en cookie.
Indien alles ok is stuur je een X-SendFile header (zie: https://tn123.org/mod_xsendfile/ ) en anders een 4XX error.

Moet je wel even kijken of je die module onder apache al geinstalleerd hebt of niet, maar dat lijkt erg makkelijk als je een recente apache install hebt.

ju5t
25/08/13, 20:26
Als ik dat via PHP doe wordt de hele file gekopieerd naar het geheugen of een temp file. Lijkt me een beetje overbodig.

Dat is niet helemaal waar, maar het lijkt me inderdaad geen geweldige oplossing.

Wat systemdeveloper aan geeft is wel een nette oplossing denk ik. Als je niet vast zit aan Apache kun je eventueel kijken naar ngx_postgres voor Nginx. Zelf geen ervaring mee, maar het ziet er flexibel genoeg uit om te doen wat je wilt: https://github.com/FRiCKLE/ngx_postgres/.

Anoniem
26/08/13, 08:03
Super bedankt voor de tips! Straks kan ik het helemaal zelf en heb geen professionele hulp meer nodig ;)

Een X-sendFile header is dus ongeveer hetzelfde als <?php header('Location: http://www.site.nl/'); ?> Met het verschil dat dit nu serverside gebeurt dus dat de client hier niks van merkt.

Die Nginx is wel interessant voor een volgend project. Momenteel regel ik alles in PL/pgSQL functies die ik aanroep vanuit AJAX via JSON requests. Dat doe ik nu via PHP waarbij ik de JSON string uitlees. Met de nieuwe JSON functie in PostgreSQL 9.3, waarbij je ook JSON strings kunt inlezen. Kan ik nu dus PHP overslaan.

Echter zie nog wel wat problemen met Nginx: Bestanden wegschrijven naar de database via html upload.
JPEG > bytea
AVI > large objects

systemdeveloper
26/08/13, 10:40
Super bedankt voor de tips! Straks kan ik het helemaal zelf en heb geen professionele hulp meer nodig ;)

Een X-sendFile header is dus ongeveer hetzelfde als <?php header('Location: http://www.site.nl/'); ?> Met het verschil dat dit nu serverside gebeurt dus dat de client hier niks van merkt.



Even gegoogled:

authenticate(); # authenticate and authorize, redirect/exit if failed
$file = determine_file();

header("X-Sendfile: $somefile");
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"'

Succes!