Let op: beschermde content op je WordPress site is mogelijk publiekelijk toegankelijk

Mogelijk beheer je een WordPress site met beschermde content dat niet publiekelijk mag zijn; denk hierbij aan PDF bestanden, afbeeldingen of video's. In de meeste gevallen blijkt het echter erg simpel te zijn om als buitenstaander deze content te benaderen via de zogenaamde 'WordPress REST API'. In deze blogpost vertellen we wat dit precies inhoudt en hoe je jezelf hiertegen kunt beschermen.

Een voorbeeld uit de praktijk

De aanleiding van deze blogpost is de site IntelliMusica. Dit is een WordPress website dat met hetzelfde probleem te maken had. Evan Handyside, eigenaar van de website, is een gitaarspeler die bladmuziek schrijft en aanbiedt op de website. Naast het gratis bladmuziek is er ook een betaalde lidmaatschap waarmee je toegang krijgt tot het premium aanbod.

Evan distribueert het bladmuziek door in het WordPress dashboard PDF bestanden te uploaden en deze als downloadlinks te plaatsen in beschermde gedeeltes van de website. De naam van de downloadlink wordt aangevuld met speciale tekens zodat bezoekers de downloadlinks niet kunnen raden. In combinatie met een goede serverconfiguratie zou dit een prima manier zijn om de betaalde content af te schermen van de buitenwereld. Er is echter één kwetsbaarheid: de WordPress REST API.


Een screenshot van IntelliMusica

Wat is de WordPress REST API?

Een API is een systeem dat veelal wordt gebruikt in softwareprogramma's en websites. Meestal is een API een collectie van URL's waarmee het mogelijk is om te communiceren met een website. In WordPress wordt de API standaard meegeleverd, wat ertoe leidt dat vrijwel alle WordPress websites een toegankelijke API hebben. In de lijst hieronder worden enkele mogelijkheden van deze API opgesomd; voor een compleet overzicht kun je het officiele handboek raadplegen.

  • Een lijst krijgen van alle gepubliceerde posts
  • Een lijst van alle gebruikers
  • Een lijst van alle pagina's
  • Een lijst krijgen van alle geüploade bestanden (Oeps..)

Dat laatste betekent dat alle inzet van Evan om zijn content te beschermen voor niets is geweest. Je kunt namelijk simpelweg de API vragen om alle geüploade bestanden via de volgende link:

https://www.intellimusica.com/wp-json/wp/v2/media

Alle bladmuziek zijn PDF bestanden. Het is mogelijk om via de API specifiek alle PDF bestanden op te vragen: API:

https://www.intellimusica.com/wp-json/wp/v2/media?per_page=20&mime_type=application/pdf

En dat is alles dat je hoeft te doen om alle betaalde content te downloaden.


Een voorbeeld van een lijst dat de API teruggeeft

Betekent dit dat API's slecht zijn?

Op dit moment denk je misschien dat API's slecht zijn voor je website. Dit is echter totaal niet het geval: API's zijn een ontzettend belangrijk middel om applicaties of services met elkaar te laten communiceren. Ik ben echter wel van mening dat de manier waarop WordPress de API heeft geimplementeerd een beetje onverantwoordelijk is. Het is niet duidelijk voor WordPress admins dat de API standaard aanstaat. Daarnaast lijkt het niet mogelijk om bepaalde content niet-publiekelijk te maken binnen het WordPress dashboard. Dit heeft als gevolg dat admins soms content delen zonder dat ze zich hiervan bewust zijn.

Hoe bescherm je je content?

Allereerst zul je moeten onderzoeken of dit een probleem is dat mogelijk op jouw website speelt. Als je geen beschermde content beheert, dan kun je het beste de API aan laten staan. In het geval van IntelliMusica was het echter nodig om een gedeelte van de API af te schermen zodat betaalde content niet opgevraagd kan worden. Er zijn meerdere manieren om dit te bereiken en de precieze oplossing is afhankelijk van je specifieke situatie. De oplossing dient zorgvuldig gekozen te worden, aangezien het uitzetten van de API ertoe kan leiden dat plugins of WordPress zelf niet meer goed werkt.

Als je met dit probleem kampt en technisch bent, dan kun je kijken naar de authenticatie documentatie of een selectie van API plugins om het probleem op te lossen. Mocht je liever niet aan het technische gedeelte zitten, dan kun je altijd contact met ons opnemen ([email protected]) om samen tot een oplossing te komen.

Share post