Zo krijg je je rapport. In Mijn Omgeving, niet in een map.

Een voorbeeld op een app die niet bestaat: jouwapp.nl. Elke bevinding staat klaar met uitleg, bewijs en wat je nu kunt doen.

Bevindingen

KritiekHertest geslaagd op 29 september

Klantgegevens zijn voor iedereen te zien

Wat we vonden
Wie één cijfer in het adres verandert, ziet het profiel van een andere klant.
Wat het betekent
Namen en e-mailadressen van al je klanten liggen open.
Zo los je het op
Laat de database per klant controleren wie wat mag zien.
Een uitsnede van het scherm op jouwapp.nl/klanten/1044, met de gegevens van een andere klant onleesbaar gemaakt.
Waar
GET /rest/v1/klanten?id=eq.1044
Oorzaak
De tabel klanten heeft geen row level security. Elke ingelogde gebruiker kan elke rij opvragen.
Categorie
OWASP A01, Broken Access Control
Oplossing
alter table klanten enable row level security;

create policy "eigen gegevens" on klanten
  for select using (auth.uid() = user_id);
HoogHertest geslaagd op 29 september

Een betaling is over te slaan

Wat we vonden
Wie na het kiezen van een abonnement de betaalpagina wegklikt en naar de welkomstpagina gaat, krijgt toch toegang.
Wat het betekent
Klanten kunnen je app gebruiken zonder te betalen.
Zo los je het op
Geef pas toegang als de betaalprovider laat weten dat de betaling binnen is, niet als iemand op betalen klikt.
Een uitsnede van de welkomstpagina voor betalende klanten, geopend zonder dat er betaald is.
Waar
POST /api/abonnement, daarna /welkom
Oorzaak
De app zet het abonnement in de browser op actief zodra iemand op betalen klikt. De webhook van de betaalprovider wordt niet gecontroleerd.
Categorie
OWASP A04, Insecure Design
Oplossing
// Alleen de webhook van de betaalprovider zet het abonnement aan.
if (event.type === "checkout.session.completed") {
  await db.abonnement.update({
    where: { klantId: event.data.object.metadata.klantId },
    data: { actief: true },
  });
}
LaagNog open

Foutmeldingen tonen te veel

Wat we vonden
Bij een fout laat de app stukjes code en de namen van tabellen zien.
Wat het betekent
Het verraadt hoe je app gebouwd is. Dat maakt het zoeken naar andere fouten makkelijker.
Zo los je het op
Toon een gewone foutmelding en bewaar de details in je logboek.
Een uitsnede van een foutmelding met code en tabelnamen, na een ongeldig nummer in het adres.
Waar
GET /api/bestellingen?id=abc
Oorzaak
De foutafhandeling stuurt error.message en de stacktrace mee in het antwoord.
Categorie
OWASP A05, Security Misconfiguration
Oplossing
catch (error) {
  console.error(error);
  return Response.json({ fout: "Er ging iets mis." }, { status: 500 });
}
  • Gewone taal

    Per bevinding lees je wat er mis is, wat het betekent en wat eerst dicht moet. Voor je developer staat de technische kant erbij.

  • Jij kiest wie het oplost

    Laat Red Nota het oplossen, dan zie je vooraf wat we aanpassen en wat het kost. Of los het zelf op met onze uitleg.

  • Hertest en attest

    Na het oplossen testen we opnieuw. Slaagt de hertest, dan kun je met een attest laten zien dat je app is nagekeken.

Je eigen rapport? Laat je app nakijken.

Laat je app nakijken