A useful audit is not an 80-page PDF or a theater of green tool dashboards. It means finding what can take down the application or leak data, proving it with evidence, and deciding what to fix first.
This 48-hour methodology applies to PHP/Laravel, Node.js, and WordPress applications (multisite, Elementor, stores with payments). When there is ecommerce or local gateways, it includes checkout and webhooks — the same surface that usually causes real incidents.
Why it matters (beyond “compliance”)
Think of security as the lock on a shop: it does not replace the business, but without it anyone can walk in. An early finding costs a sprint; an incident costs customers, reputation, and days of firefighting.
- Money: manipulable payments or unsigned webhooks.
- Data: orders or users visible via IDOR.
- Operations: admin without MFA, abandoned plugins, public
.env. - Priority: without P0/P1/P2, everything feels urgent and nothing ships closed.
Key concepts in plain language
- Attack surface: everything a stranger can touch (forms, APIs, uploads, admin).
- Authentication vs authorization: “who you are” vs “what you may do”. Different failures.
- IDOR: changing
/orders/100to/orders/101and seeing someone else’s order. - Injection: feeding data the system treats as instructions (SQL, XSS, path traversal).
- Dependencies: third-party code with known bugs; updating is also security.
48-hour breakdown
Hours 0–4: attack surface map
- Inventory of public routes (web + API).
- Forms, uploads, payment webhooks, cron endpoints.
- Current headers, cookies, redirects.
- On WordPress: version, child theme, active plugins, administrator users.
- On multisite: sites, super-admins, and network plugins.
Hours 4–16: authentication and session
- Password reset, user enumeration, rate limiting.
Secure/HttpOnly/SameSitecookies.- CSRF on state-changing forms.
- JWT:
exp, rotation, insecure storage inlocalStorage. - WordPress admin or Filament/Horizon exposed without MFA.
Hours 16–32: injection and business logic
- Misused SQL / ORM, stored XSS, path traversal.
- Mass assignment in Laravel (
$fillable/$guarded). - IDOR: can you view order
#id+1? - On payments: confirm the amount is not trusted from the client.
- Uploads: real file type, not just the extension.
Hours 32–48: dependencies and deliverable
composer/npm auditwith judgment (noise vs real risk).- Abandoned WordPress plugins or those with known advisories.
- Secrets in repo, exposed
.env, public backups. - P0/P1/P2 report + remediation plan by sprint.
Laravel: review points
- Validation with Form Requests on all API inputs.
- Authorization: Policies/Gates on show/update/destroy.
- Mass assignment: models with
$guarded = []or dangerous fillables. - Files: private
Storagedisk; signed URLs. - Queues with backoff and dead-letter; payloads without unnecessary PII.
APP_DEBUG=falsein prod; Telescope/Horizon not public.
WordPress: review points
- Remove generic
adminuser; review roles; 2FA on privileged accounts. - XML-RPC: disable if no legitimate app needs it.
- REST: user endpoints that leak information.
- Uploads: execution blocked in
uploads. - WooCommerce: updated gateway plugins; webhooks with minimum permissions.
Common “audit” mistakes
- Trusting only an automatic scanner without validating findings by hand.
- Ignoring business logic (amounts, order IDs, role permissions).
- Delivering a CVE list without prioritizing impact on this product.
- Skipping deploy review: the same secret or old plugin returns in the next release.
- Marking everything critical: the team saturates and does not fix what is exploitable today.
Practical checklist
- Are
.env,.git, or backups accessible by URL? - Do login, reset, and sensitive APIs have rate limiting?
- Do session cookies have correct flags on HTTPS?
- Is CSRF active on state-changing forms?
- Do policies/capabilities exist and get called on every route?
- Do uploads validate real MIME types?
- Do payment webhooks validate signature/origin and are idempotent?
- Do security headers (CSP, HSTS) exist without breaking the front end?
- Do critical dependencies have an update owner?
- Can deploy reintroduce the same secret or old plugin?
Deliverable format
| Priority | Criteria | Example |
|---|---|---|
| P0 | Exploitable now / high impact | RCE, SQLi, manipulable payment, public .env |
| P1 | High risk | Stored XSS, order IDOR, CSRF on sensitive actions |
| P2 | Hardening | Incomplete headers, old plugins not yet exposed |
Each finding includes: where, how to reproduce, risk, suggested fix, and relative effort. Connects with DevOps and Coolify, and cybersecurity .