wwff.tech Let's talk
SAMPLE DEFUSE REPORT

What a Defuse review actually tells you.

This is a real report, run against a sample app built to look like weekend AI work: Walkies, a dog-walking booking tool. The app is invented so nobody's live product is on show here; every finding below is one I meet in real ones.

SAMPLE · APP: WALKIES · 9 FINDINGS

The verdict: Fix

Walkies is worth keeping. The idea is proven, the data model is sensible, and the shape of the app — a small API over a database, with a plain front end — is the right shape. A rebuild would throw away good work to solve problems that are cheaper to fix in place.

But it cannot go in front of real customers as it stands. Four of the nine findings let an outsider read or control other people's data, and two of those need nothing more than a browser. The problems cluster in two places — how the app decides who you are, and how it handles what you type — and both are replaceable without touching the parts that work.

In one sentence: the product is right; the plumbing around login, permissions and input needs to be redone, and that is a week or two of focused work, not a restart.

  • Keep The feature set, the database design, and the overall structure stay.
  • Fix Replace the session and permission layer; parameterise the database access; move secrets and the AI call server-side.
  • Rebuild Not needed. Nothing here is wrong at the foundations.

Findings at a glance

Ranked by what an attacker could actually do with them, worst first. Full detail follows the table.

RiskIDFindingWhat it exposes
CriticalD-01The database downloads over the webEvery customer's details, password hashes and booking notes
CriticalD-02The login cookie can be rewritten by handAnyone can become the admin
CriticalD-03The walker search runs text you type as a commandThe whole database, without logging in
CriticalD-04Saving your profile can make you an adminFull control, from an ordinary account
HighD-05Any booking is readable by its numberAlarm codes and where the key is left
HighD-06Passwords are stored with broken hashingReused passwords, once the data leaks
HighD-07Whether you're an admin is decided in the browserA lock with the key taped beside it
HighD-08The AI feature has no login and no limitUnbounded spend on your account
MediumD-09Any website can act as your logged-in usersActions taken in a visitor's name

The real report also lists what was checked and found clean. It is left out here to keep the sample short.

The findings in full

Critical D-01 · The database downloads over the web

What it is. The app tells the web server to hand out every file in its own folder, and the database lives in that folder. A visitor who requests it by name — and the name is the usual one — downloads the whole thing.

Why it matters. That one file is the entire customer list — names, phones, addresses — their password hashes, every walker, and every booking note, which here include alarm codes and where the key is left. It is handed over with no login and no trace beyond a line in a log: the single fastest way to lose everything at once.

The fix. Serve only the folder of public front-end files, never the application folder, and keep the database outside the web root entirely. It is a one-line change to what is shared, plus moving one file.

Critical D-02 · The login cookie can be rewritten by hand

What it is. When you log in, the app gives your browser a cookie that simply spells out your user number and whether you're an admin, in a format anyone can read and change. Nothing stops a visitor writing their own cookie that says "I am user 1, and I am an admin."

Why it matters. It turns every admin-only page into a public one. The attacker doesn't need a password, a leak, or any skill beyond editing a value in their browser.

The fix. Use signed, server-verified sessions — a standard, well-tested library rather than a hand-rolled cookie — so a cookie the server didn't issue is rejected. The app already has a login step to hang this on.

Critical D-03 · The walker search runs text you type as a command

What it is. The "find a walker" box drops whatever you type straight into the instruction the app sends its database. Type the right punctuation and the rest of your text becomes a new command the database obediently runs.

Why it matters. The search needs no login, so this is open to the public, and it is not limited to searching: the same hole reads any table — users, passwords, addresses — and in the wrong setup can change or delete data too. It is the classic way databases get emptied.

The fix. Never build a database instruction by gluing text together. Use parameters, which keep what you typed as a value to match, never as a command. Every query in the app should be checked and converted the same way.

Critical D-04 · Saving your profile can make you an admin

What it is. When you edit your profile, the app saves every field the browser sends, trusting the list. But the account's permission level is a field on the same record, so a request that includes it will set it — including to "admin".

Why it matters. Any signed-up customer can promote themselves to full control, then do everything D-02's attacker could, from a real account. It needs no trickery, only knowing the field is there — and fields like this are easy to guess.

The fix. Decide explicitly which fields a user may change about themselves — name, phone, address — and ignore anything else. Permission level is set by the app, never by the request.

High D-05 · Any booking is readable by its number

What it is. Bookings are numbered 1, 2, 3, and the app will show you any of them if you ask by number. It checks that you're logged in, but not that the booking is yours.

Why it matters. In this app the booking notes hold alarm codes and where the door key is left. One logged-in customer can walk the numbers and collect the lot — a physical-security problem, not just a data one. This pattern, reading other people's records by changing a number in the address, is one of the most common serious flaws in AI-built apps.

The fix. On every record fetched by its number, check it belongs to the person asking before returning it. The ownership check is one line, and it belongs on each of these endpoints.

High D-06 · Passwords are stored with broken hashing

What it is. Passwords are stored scrambled with MD5, an old method that is both reversible in practice and fast enough to guess billions of times a second. There is no per-user salt, so identical passwords look identical in the table.

Why it matters. The point of hashing is that a stolen database still doesn't hand over the passwords. This hashing doesn't achieve that: common passwords fall in seconds, and because people reuse them, the damage spreads to your customers' other accounts. It turns one leak into many.

The fix. Store passwords with a modern, deliberately slow password hash (bcrypt, scrypt or Argon2), each with its own salt. Re-hash on next login so existing accounts migrate quietly.

High D-07 · Whether you're an admin is decided in the browser

What it is. The front-end code decides whether to show the admin features by checking the logged-in user's role — a value the browser holds and can change. The server never checks again.

Why it matters. Hiding the admin button in the browser is a lock with the key taped beside it. Anyone can reveal the hidden controls, or simply call the admin endpoints directly; the only thing stopping them was a button that wasn't drawn. The server-side hole that lets those calls through is D-02 — this finding is why fixing D-02 alone isn't enough, and why access control can never live in the page.

The fix. Decide and enforce every permission on the server. The front end may hide a button for tidiness, but must never be the thing that guards it.

High D-08 · The AI feature has no login and no limit

What it is. The "write a bio for my dog" endpoint can be called by anyone, without logging in, as often as they like — and the caller gets to say which AI model to use and how long the answer may be, the two things that set the price.

Why it matters. This is a direct line to spend money on your account, handed to the public with the size dial included. A simple loop can run a large bill overnight; this is exactly the kind of surprise that turns a cheap side-feature into a four-figure invoice.

The fix. Require a login, cap how often each user may call it, and fix the model and the limits on the server rather than taking them from the request. Decide a daily ceiling and alert when it's approached.

Medium D-09 · Any website can act as your logged-in users

What it is. The app tells browsers that any other website may make requests to it and send along the visitor's login cookie. The intent is usually "let my own front end talk to my API"; the effect is "let everyone's". The session cookie is set to be sent on cross-site requests too, so nothing catches it on the way in.

Why it matters. A customer who is logged in to Walkies and then visits a malicious page can have actions taken in their name — a booking made, their profile changed — without noticing. On its own it's awkward to exploit, which is why it's Medium; combined with the auth findings above, it widens their blast radius.

The fix. Allow only the app's own web address to make these requests, listed explicitly, rather than reflecting whatever asked.

What £950 actually covers

The report above is the part you read. It sits on top of a full assessment, and the fixed £950 covers all of it — the work, and the evidence behind every line.

A scanner will happily hand you two hundred warnings, and most are noise. What you're paying for is someone who has run the scans, read your code by hand, and can tell you which handful actually matter — then hands you the raw output as well, every result marked real, worth-checking, or false alarm, so nothing here is something you have to take on trust.

The work behind it

  • Attack-surface recon. What the outside world can see: subdomains and exposed services, your DNS and email setup, TLS and HTTP security headers, and secrets left somewhere public.
  • Automated scanning. Static analysis of the code, secret scanning, and a dependency audit for known-vulnerable libraries — the CVEs hiding in your package list.
  • Manual code and architecture review. A person reading the code, the configuration and the data model, because the findings that hurt most — D-02, D-04 and D-05 above — are logic flaws no scanner catches.

What lands in your inbox

  • This findings report, risk-ranked, with the Keep / Fix / Rebuild verdict and the reasoning shown.
  • A remediation plan your AI tool can follow, in fix order.
  • Every scan and recon artefact, annotated — not a raw dump, but each result explained, so you own the evidence as well as the conclusions.
  • A 45-minute walkthrough call — and the report is yours, to take to any developer.

What happens next

With a real app, the report ends with a plan in the order a fix should happen — and in a form your AI tool can follow, so you can do the work yourself if you'd rather.

  1. FIRST

    Stop the bleeding

    D-01 and D-03 are reachable by the public with no account. They come first, and both are same-day.

  2. THEN

    Fix who-you-are

    Replace the session and permission layer (D-02, D-04, D-07), then the ownership checks (D-05). This is the bulk of the work.

  3. THEN

    Money and data

    Lock down the AI endpoint (D-07, D-08), then re-hash passwords and tighten cross-site access (D-06, D-09).

  4. AFTER

    Keep it closed

    A CI check and an AI rules file so the same mistakes don't come back next weekend. This is the Guardrails tier.

Your app, reviewed like this.

Everything above — the recon, the scans, the manual review, the annotated evidence and the walkthrough — for a fixed £950. You own the report, and can take it to any developer.