Wat is een veilige aanpak voor downloadscripts?

Via een forum post op PFZ.nl kwam ik de onderstaande vraag tegen. Uit de beveiligingsscans die ik op websites uitvoer, zie ik vaak de onderstaande aanpak terug komen. Daarom leek het mij nuttig om deze casus ook via de weblog weer te geven.

“Ik heb op mijn klantenwebsite een plaats waar men eigen facturen kan opslaan. Nu wil ik het graag zo beveiligen dat men niet de facturen van andere klanten kan downloaden. De manier waarop ik het wil opslaan is als hieronder staat weergegeven, via twee variabelen. Is dit veilig?

/klantenmappen/{$klantnummer}/facturen/{$factuurnummer}.pdf

Ik zou bestanden met vertrouwelijke inhoud nooit opslaan met een te raden bestandsnaam en ik zou ook nooit rechtstreeks naar een vertrouwelijk bestand linken. Een kwaadwillend persoon kan op oplopende nummers zoeken en zo documenten terug vinden. Dit kan worden verwezenlijkt via een script dat dit automatiseert en duizenden GET aanvragen op de webserver afvuurt.

Wat is wel veilig?

  1. Sla bestanden met een vertrouwelijk karakter op buiten de door de webserver geserveerde map, zoals buiten de htdocs of public_html map.
  2. Voeg in je database een extra kolom toe, waarin je een random nummer opslaat. Gebruik dit nummer om bestanden op het bestandssysteem op te slaan, zodat niemand de bestandsnamen kan raden.

Via een downloadscript kan je het bestand dan doorgeven aan de eindgebruikter. Dit script controleert meteen of je ook toegang mag hebben tot dit bestand. Tevens kan dit script ook meteen een mooie bestandsnaam genereren en aan de download toevoegen. Wel zo handig voor de administratie van de eindgebruiker :-)

Overigens is het opslaan van bestandsnamen onder een niet te raden bestandsnaam is een extra beveiliging voor wanneer je website een Local File Inclusion lek heeft. In dat geval is geheimhouding van bestandsnamen weer een extra drempel die de aanvaller moet nemen.

About Sijmen Ruwhof

Independent IT Security Researcher / Ethical Hacker
This entry was posted in website security. Bookmark the permalink.