Beveilig de bestanden op je website goed | Waarom (en hoe in Drupal)

15 jan 2018

Joris Snoek - Business Dev
Vragen? Let me know:
020 - 261 14 99

Toen we met oud en nieuw naar Parijs vertrokken, hadden we een catsitter nodig, ik zocht en vond Pawshake: een internationaal platform waarop we al snel iemand vonden. Ik zag al snel dat het een Drupal platform betrof, maakte een profiel aan en nam meteen even de proef op de som: wordt mijn profielfoto wel beschermd…? Niet dus! Zonder in te loggen kan iedereen mijn afbeelding zien. Check maar, niet best.

Per 25 mei 2018 is de Algemene verordening gegevensbescherming (AVG) van toepassing, waardoor een extra check op beveiliging van je bestanden sowieso aan te raden is. Hierbij enkele handvatten:

Publiekelijk vs privé bestanden

Als je een website -of app beheerd, dan zijn er generiek gezien twee soorten bestanden: publiekelijk of privé. Technisch gezien zal je een keuze moeten maken hoe die files beheerd worden door je content management systeem en daar de juiste beveiliging op toepassen. Dit is afhankelijk van het soort dienst wat je aanbiedt op de website -of app.

Publiekelijke bestanden

Deze worden voornamelijk gebruikt voor websites met openbare content, waar niemand inlogt (behalve content managers en admins) en die meestal bedoeld zijn voor product -en services informatie.

Privé bestanden

Deze worden voornamelijk gebruikt in geval van een web applicatie, bijvoorbeeld een:

  • Social intranet;
  • Online community;
  • Chat applicatie.

In dit laatste geval wil je graag dat alle bestanden die een gebruiker upload niet door iedereen te bezichtigen zijn -je zult je systeem daarop moeten inrichten.

Private en public files in Drupal

Drupal bevat een uitgebreid file management systeem, wat public -en private files kan faciliteren. Je kunt de instellingen hiervan bereiken via het configuration scherm:

Zodra je File system aanklikt verschijnen de details:

  1. Directory waar de public files worden opgeslagen.
  2. De absolute URL die vóór alle public files wordt gezet
  3. Directory waar de private files worden opgeslagen, in dit geval nog niet geactiveerd.
  4. Standaard manier hoe file gedownload worden, zodra de private files directory staat ingesteld kan je hier ook kiezen voor private.
  5. Tijd voordat tijdelijke / orphaned files definitief worden verwijderd. Dit zijn alle files met status 0 in de database.

Private files in Drupal activeren

Bovenstaande is een standaard installatie, waarin files dus public staan. Maar zoals hierboven beschreven wil je wellicht je files afschermen, zodat users met de juiste permissie erbij kunnen -en niet de gehele, anonieme wereld. Dit gaat als volgt:

Configureer de private files directory in settings.php:

In dit geval kies ik voor ../files. Zorg ervoor dat deze directory buiten de webroot is, anders heb je alsnog kans dat je private files publiekelijk beschikbaar zijn. Als je vervolgens de caches leegt (Flush all caches) dan kan je private files als default download methode kiezen:

  1. Het path zoals ingesteld in settings.php
  2. Wijzig de /tmp directory, zodat ook tijdelijk files beschermd zijn.
  3. Stel private files in als default download methode.

Drupal is nu ingesteld om alle bestanden als privé te behandelen: als bezoekers nu een bestand willen downloaden, of bijvoorbeeld een afbeelding willen bekijken, dan gaat dat via een Drupal system call en niet door het direct aanroepen van het bestand door de browser. In die call wordt door Drupal bepaald of betreffende bezoeker permissie heeft het bestand te downloaden.

Zelf bepalen wanneer iemand een private file mag downloaden of niet -mbv hook_file_download().

Wij bouwen momenteel een chat applicatie op basis van Drupal en NodeJS: Lus. Daarin zijn channels (groep chats), waarin bestanden gedeeld kunnen worden. Wij willen uiteraard dat alleen mensen die in betreffende channel zitten de bestanden in die groep kunnen downloaden. Zit je bijvoorbeeld niet in groep A, dan moet het onmogelijk zijn om bestanden in die groep A te benaderen.

Meer info over Lus, zie lus.digital & docs.lus.digital.

Dit betreft een custom web-app, daarom bevat Drupal geen geschikte permissies om dit afdoende veilig te maken. Maar niet getreurd: hook_file_download() to the rescue, hierbij de code die wij produceerde in onze .module file:

Drupal herkent de hook_file_download(), waardoor hij deze functie zal aanroepen zodra iemand een file gaat downloaden via het private file system van Drupal.

Wat deze code basically doet:

  1. Check wie huidige gebruiker is.
  2. Check of die user in het channel zit waar de file is geüpload.
  3. Zit de user in het channel: laad de file en return de file, waardoor hij beschikbaar wordt voor betreffende bezoeker.
  4. Zit de user niet in betreffend channel: geef een not found.

Generiek gezien hebt je dus public en private files op het internet. Bepaal dus welk bestand systeem je nodig hebt, voordat je start met het produceren van een online platform, website of app. Als je Drupal inzet, dan hoop ik dat je met bovenstaande info de files goed en veilig kan inrichten. Vragen? Let me know!

Credits foto’s

Nóg meer
kennis nodig?

Check ons ons blog archief >