Gebruik een Claude Code beveiligingschecklist om snel concrete spot-checks uit te voeren op authenticatie, invoervalidatie, omgang met geheimen en injectieoppervlakken in webapps.

Een lichte beveiligings-spotcheck is een snelle review (vaak 30–60 minuten) bedoeld om voor de release zichtbare, hoog-impact problemen te vinden. Het is geen volledige audit. Zie het als een veiligheidsrondgang: je scant de paden die in echte apps het vaakst falen en zoekt naar bewijs, niet naar gissingen.
Deze Claude Code beveiligingschecklist richt zich op de gebieden die in dagelijkse webapps het vaakst misgaan:
Hij probeert niet de afwezigheid van bugs te bewijzen, complexe dreigingsactoren te modelleren of penetratietesten te vervangen.
"Concrete bevindingen" betekent dat elk probleem dat je noteert bewijs bevat waar een ontwikkelaar direct mee aan de slag kan. Voor elke bevinding leg je vast:
AI is een helper, geen autoriteit. Gebruik het om te zoeken, samen te vatten en tests voor te stellen. Verifieer daarna door de code te lezen en, waar mogelijk, te reproduceren met een echt request. Als het model geen specifieke locaties en stappen kan aanwijzen, behandel de claim dan als onbewezen.
Een snelle review werkt alleen als je het doel versmalt. Voordat je Claude Code iets laat bekijken, beslis wat je vandaag probeert te bewijzen en wat je niet controleert.
Begin met 1 tot 3 echte gebruikersroutes waarbij fouten geld kosten, gegevens blootstellen of macht geven. Goede kandidaten zijn inloggen, wachtwoordherstel, checkout en admin-bewerkingsschermen.
Benoem vervolgens de assets die je moet beschermen. Wees specifiek: gebruikersaccounts, betaalacties, persoonlijke data, admin-only bewerkingen.
Schrijf daarna je dreigingsaannames in gewone taal op. Verdedig je tegen een nieuwsgierige gebruiker die rondklikt, een externe aanvaller met scripts of een insider met beperkte toegang? Je antwoord verandert wat "goed genoeg" betekent.
Definieer ten slotte pass en fail zodat je spot-check eindigt met bevindingen, niet met een gevoel. Eenvoudige regels werken goed:
Als je niet kunt beschrijven hoe falen eruitziet, is de scope nog te vaag.
Een spot-check werkt alleen als het model naar de juiste plekken kijkt. Verzamel een klein pakket code en notities zodat de review bewijs kan leveren, geen gissingen.
Begin met het delen van het security-kritieke pad: request-entrypoints en de code die bepaalt wie de gebruiker is en wat ze mogen doen. Voeg net genoeg omliggende code toe om te laten zien hoe data stroomt.
Een praktisch pakket bevat meestal:
Voeg een paar regels omgevingsnotities toe zodat aannames expliciet zijn: sessie versus JWT, waar tokens leven (cookie of header), reverse proxy of API-gateway gedrag, queues/cron workers en eventuele "internal-only" endpoints.
Vraag eerst om een inventaris: entrypoints, geprivilegieerde endpoints en datastores die worden geraakt. Dit voorkomt gemiste oppervlakken.
Kom ook overeen welk outputformaat concrete bevindingen afdwingt. Een simpele tabel werkt goed: Bevinding, Ernst, Getroffen endpoint/bestand, Bewijs (exact fragment of regelbereik), Exploit-scenario, Oplossingssuggestie.
Timebox het:
Het doel is geen perfecte dekking. Het is een kleine set testbare bevindingen.
Houd de app open terwijl je leest. Klik door de UI en bekijk welke requests worden gestuurd. Notities moeten naar specifieke endpoints, parameters en gegevensbronnen verwijzen.
Een workflow die in één zitting past:
Een nuttige gewoonte: voor elke "lijkt prima", beschrijf hoe je het zou breken. Als je geen poging kunt beschrijven om te breken, heb je het waarschijnlijk niet echt geverifieerd.
Authenticatie is waar de app beslist: "dit request behoort tot deze persoon." Een snelle spot-check gaat niet over elke regel lezen. Het gaat om het vinden van de plek waar identiteit wordt vastgesteld en het controleren van shortcuts en faalwegen.
Lokaliseren van de trust-boundary: waar wordt identiteit eerst gemaakt of geaccepteerd? Het kan een sessiecookie, een JWT-bearer-token, een API-sleutel of mTLS aan de edge zijn. Vraag Claude Code om het exacte bestand en de functie aan te wijzen die "anonymous" in een user-id omzet, en om alle andere paden te noemen die hetzelfde kunnen doen.
Authn-checks die het waard zijn te scannen:
Een praktisch voorbeeld: als reset-mails "account niet gevonden" teruggeven, is dat snel een enumeratieprobleem. Zelfs met een generiek bericht kunnen timingverschillen hetzelfde lekken, dus controleer ook responstijden.
Autorisatie is de vraag die de meeste schade veroorzaakt als het fout is: "Mag deze gebruiker deze actie op precies deze resource uitvoeren?" Een snelle spot-check moet proberen die aanname doelbewust te doorbreken.
Schrijf rollen en permissies in gewone taal. Houd het menselijk:
Verifieer daarna dat elke gevoelige actie authz server-side afdwingt, niet alleen in de UI. Knoppen kunnen verborgen zijn, routes kunnen in de client geblokkeerd zijn, maar een aanvaller kan nog steeds direct de API aanroepen.
Een snelle scan die meestal echte issues vindt:
De klassieke IDOR-geur is simpel: een request zoals GET /projects/{id} waarbij {id} door de gebruiker wordt geleverd en de server het laadt zonder te verifiëren dat het bij de huidige gebruiker of tenant hoort.
Een prompt die een echt antwoord afdwingt:
"Voor dit endpoint, laat de exacte code zien die toegang beslist, en noem de specifieke voorwaarden die het mogelijk zouden maken dat een gebruiker van een andere orgId het kan benaderen. Als er geen zijn, leg uit waarom met bestands- en functienamen."
De meeste snelle webapp-issues beginnen met een kloof: de app accepteert invoer die de ontwikkelaar niet verwacht. Beschouw "invoer" als alles wat een gebruiker of een ander systeem kan beïnvloeden, ook als het onschuldig lijkt.
Begin met het benoemen van de inputs voor het endpoint dat je spot-checkt:
Validatie moet gebeuren dicht bij waar data de app binnenkomt, niet diep in de businesslogica. Controleer de basis: type (string vs nummer), maximale lengte, verplicht vs optioneel en formaat (e-mail, UUID, datum).
Voor bekende waarden zoals rollen, statusvelden of sorteer-richtingen heeft een allowlist de voorkeur. Dat is moeilijker te omzeilen dan het blokkeren van een paar slechte waarden.
Controleer ook foutafhandeling. Als de app invoer afwijst, echo niet de ruwe waarde terug in de response, logs of UI. Zo veranderen kleine validatiebugs in datalekken of hulpjes voor injecties.
Een snelle "foute invoer" mini-plan voor risicovolle endpoints (login, search, upload, admin-acties):
Voorbeeld: een sort-parameter die elke string accepteert kan later een SQL-fragment worden. Een allowlist zoals "date" of "price" voorkomt die foutklasse vroeg.
De meeste snelle reviews vinden issues op dezelfde plekken: overal waar gebruikersinvoer wordt geïnterpreteerd als code, query, pad of URL. Dit is het gedeelte waarin je zoekt naar momenten waarop "invoer een trust boundary kruist".
Traceer data van entrypoints (query params, headers, cookies, uploads, admin-formulieren) naar waar het eindigt.
Let op deze patronen en eis een concreet callsite en payloadvoorbeeld voor elk:
ORDER BY, en IN (...) builders die user-waarden samenvoegenLet ook op deserialisatie en template-injectie. Alles wat user-provided JSON, YAML of templated strings parset kan risicogedrag verbergen, vooral als het custom types, expressies of server-side rendering ondersteunt.
Als een feature een URL, bestandsnaam of geformatteerde tekst accepteert, ga er vanuit dat het kan worden misbruikt totdat je het met codepaden en tests kunt bewijzen.
Problemen met geheimen zijn vaak luid zodra je weet waar je moet kijken. Richt je op waar geheimen leven en waar ze per ongeluk gekopieerd kunnen worden.
Veelvoorkomende plekken waar geheimen verschijnen:
Vervolgens dwing je een concreet antwoord af: als een geheim vandaag wordt blootgesteld, wat gebeurt er dan? Een goed systeem heeft een rotatiepad (nieuwe sleutel uitgegeven), intrekking (oude sleutel uitgeschakeld) en een manier om snel opnieuw te deployen. Als het antwoord is "we veranderen het later", behandel dat dan als een bevinding.
Least privilege is een andere snelle winst. Incidenten worden erger omdat sleutels te machtig zijn. Zoek naar databasegebruikers die tabellen kunnen droppen, third-party tokens die accounts kunnen beheren of API-keys die over omgevingen gedeeld zijn. Geef de voorkeur aan één sleutel per service, per omgeving met de kleinste set permissies.
Snelle spot-check prompts die je in Claude Code kunt plakken:
Bevestig tot slot guardrails: blokkeer geheimen in source control (pre-commit/CI checks) en zorg dat backups of snapshots geen platte-tekst referenties bevatten. Als je platform snapshots en rollback ondersteunt, verifieer dan dat geheimen runtime worden geïnjecteerd en niet in baked images zitten.
Vage prompts leveren vage antwoorden. Dwing het model om zich te committeren aan bewijs: exacte locaties, een trace die je kunt volgen, een repro die je kunt draaien en wat de claim fout zou maken.
Gebruik één patroon per keer en vraag het daarna te reviseren nadat je een detail bevestigd of afgewezen hebt.
Als de output nog steeds vaag voelt, maak het concreet:
"Antwoord alleen met: bestandslocatie, functienaam, risicovolle regel en een één-zin impact."
Profile-update endpoints verbergen vaak toegangscslechtere controleproblemen. Hier is een klein geval om door deze checklist te lopen.
Scenario: een API-endpoint werkt een gebruikersprofiel bij:
PATCH /api/profile?accountId=123 met JSON zoals { "displayName": "Sam" }.
Je vraagt Claude Code de handler te vinden, te traceren hoe accountId wordt gebruikt en te bewijzen of de server eigendom afdwingt.
Wat er vaak naar boven komt:
accountId uit de querystring en werkt dat account bij zonder te controleren of het overeenkomt met de ingelogde gebruiker.displayName wordt getrimd, maar accountId wordt niet gevalideerd als integer."... WHERE account_id=" + accountId.Een goede write-up is concreet:
accountId wordt aangepast; SQL wordt gebouwd uit onbeheerde inputaccountId van de client; gebruik op de server de geauthenticeerde gebruikers-id; parameteriseer de queryaccountIdNa patchen, controleer snel opnieuw:
accountId en bevestig dat het faalt.De snelste manier om een kwetsbaarheid te missen is te vertrouwen op wat de UI afdwingt. Een knop die verborgen of uitgeschakeld is, is geen permissiecheck. Als de server het request toch accepteert, kan iedereen het replayen met een andere gebruikers-id, rol of direct API-call.
Een andere veelvoorkomende miss is een vage opdracht. "Doe een security review" levert meestal een generiek rapport. Een spot-check heeft een strakke scope nodig (welke endpoints, welke rollen, welke data) en een strikt outputformaat (bestandsnaam, functie, risicovolle regel, minimale repro).
Dezelfde regel geldt voor AI-output: accepteer geen claims zonder aanwijzingen. Als een bevinding geen concrete codelocatie en een stapsgewijze trigger bevat, behandel het als onbewezen.
Deze valkuilen komen steeds terug:
Als je jezelf betrapt op het steeds toevoegen van filters voor elke nieuwe edge-case, pauzeer. De fix zit meestal eerder en eenvoudiger: valideer invoer aan de grens en maak autorisatiechecks expliciet en gecentraliseerd zodat elk codepad ze gebruikt.
Deze vervangen geen volledige review, maar vangen fouten die insluipen als iedereen moe is. Houd ze gericht op wat je snel kunt bewijzen: een request dat je kunt sturen, een pagina die je kunt laden, een logregel die je kunt vinden.
Vijf snelle spot-checks die meestal lonen:
Schrijf de top 3 fixes op die je deze week kunt uitrollen, geen wenslijst. Voorbeeld: (1) voeg rate limiting toe aan login en wachtwoordreset, (2) dwing server-side eigendomschecks af op het "get by id" endpoint, (3) zet inputlengtegrenzen en weiger onverwachte karakters voor het zoekveld.
Een spot-check betaalt zich alleen uit als de resultaten veranderen wat je uitbrengt. Zie deze checklist als een kleine, herhaalbare buildstap, niet als een eenmalige reddingsactie.
Zet elke bevinding om in een backlog-item dat moeilijk verkeerd te interpreteren is:
Kies een cadans die past bij je risico en teamgrootte. Voor veel teams is elke release ideaal. Als releases frequent zijn, doe dan maandelijks een 30–60 minuten review en een kortere check vóór het uitbrengen.
Maak het herhalen makkelijker door een herbruikbare prompt-pack en een checklist-template te maken. Houd prompts gefocust op concrete outputs: laat de route zien, de guard, het falende request en het verwachte gedrag. Sla de pack op waar je team al werkt zodat hij niet wordt overgeslagen.
Als je apps bouwt via chat, veranker de checklist in de planning. Voeg een korte "security assumptions" notitie toe voor authn/authz, inputs en geheimen, en voer de spot-check uit direct na de eerste werkende versie.
Platforms zoals Koder.ai (koder.ai) passen goed bij deze gewoonte omdat ze snelle iteratie mogelijk maken terwijl review-checkpoints behouden blijven. Gebruik van snapshots en rollback rond risicovolle wijzigingen maakt het eenvoudiger om beveiligingsfixes uit te rollen zonder vast te lopen wanneer iets anders breekt.