tfpdev
5.1Part 5 · The report

The Report

The whole audit on one page: what I checked, how long it took, and every problem ranked by how bad it is. Each one says what it means for Northwind, and a button shows it happening for real.

01The report

A week before launch I spent five days on Northwind's new client cabinet — logging in, opening invoices, paying, and the help bot. Here is everything I found, worst first, each with a button that shows it happening for real.

Launch: not yetSix things first: three critical, three high.
  1. 01 · CriticalThe database key is in the browser
  2. 02 · CriticalChange the number, read someone else's invoice
  3. 03 · CriticalA forged message marks an invoice paid
  4. 04 · HighDouble-tap Pay, charged twice
  5. 05 · HighThe cabinet bot reads every client's files
  6. 06 · HighMoney is stored as a decimal that drifts
Findings by severity
3Critical
3High
4Medium
2Low

8 of 12 already have a whole chapter in Parts 1–4. The rest are new to this cabinet.

The automatic tools found 0 of these 12. They flag out-of-date libraries and stray passwords, not bugs in how money and files move. All of these came from reading the code.

02 · The findings

Worst first. Each one: what's wrong, what it means for Northwind, a button that shows it happening, and the fix in one line with a link to the chapter that explains it.

The cabinet's code is open — read it on GitHub →

Critical

3
Critical

The database key is in the browser

4.1

The master key to the whole database is sitting in the web page, where any visitor can copy it.

What it means for Northwind

With that key, anyone reads and changes every client's invoices and files directly, not just their own. The login in front of it stops nothing.

The fix

Keep the full-rights key on the server; give the browser a key scoped to the logged-in client, or no key at all.

4.1 Someone Else's Files →
Critical

Change the number, read someone else's invoice

4.1

To see an invoice the cabinet only checks that you're logged in. Change one number in the address and you're looking at another client's invoice.

What it means for Northwind

Logged in as Brightlane, change the number and another client's invoice opens: amount, plan, payment status. Nothing was hacked.

The fix

Check the invoice belongs to the logged-in client, and let the database refuse the rest even if a page forgets.

4.1 Someone Else's Files →
Critical

A forged message marks an invoice paid

2.3

When the payment company says an invoice is paid, the cabinet doesn't check the message is really from them. A faked message works just as well.

What it means for Northwind

A €5,800 invoice flips to paid with no money behind it. The studio ships the work, then finds the money never arrived.

The fix

Verify the provider's signature over the raw body before acting, and ignore anything that fails.

2.3 Webhooks →

High

3
High

Double-tap Pay, charged twice

2.2

If you tap Pay twice, or your phone retries, you're charged twice for the same invoice.

What it means for Northwind

The €5,800 Studio retainer comes out of a client's account twice. They notice before the studio does.

The fix

Carry one idempotency key per payment all the way to a unique constraint in the database.

2.2 Idempotency →
High

The cabinet bot reads every client's files

4.2

The help bot reads every client's files to answer anyone. It just hides where the answer came from.

What it means for Northwind

A client asks about their own project and the answer quotes Tidepool's confidential file. Tidepool signed a confidentiality clause.

Show me
The fix

Search only the files that client may open, so the bot never reads the rest.

4.2 The Bot Knows Too Much →
High

Money is stored as a decimal that drifts

2.6

Money is kept as the kind of number that can't hold exact cents. Split a bill in two and a cent goes missing.

What it means for Northwind

Split invoices and partial payments stop adding up. By month end the books and the bank disagree, and nobody can say why.

The fix

Store money as whole cents in integers; split with a method that assigns the leftover cent on purpose.

2.6 Money Math →

Medium

4
Medium

Personal data in briefs goes to the AI

4.4

Anything a client puts in a brief is sent to the AI as-is, even personal details they shouldn't have shared.

What it means for Northwind

Halden's brief has patient records in it. They leave the building for a third-party model with the rest of the text.

Show me
The fix

Swap personal data for placeholders before sending, and put it back only for the person reading the answer.

4.4 What Leaves for the AI →
Medium

File links never expire

4.6

A link to a file works forever, for anyone who has it, long after the project ends.

What it means for Northwind

The freelancer who rebuilt the cabinet still has links to a finished project's files. They open fine today.

Show me
The fix

Sign links, expire them in minutes, bind them to one person, and kill them when access is revoked.

4.6 The Link That Never Dies →
Medium

No limit on logins or bot questions

Nothing stops someone trying thousands of passwords, or asking the bot so many questions it runs up a bill.

What it means for Northwind

One client account is one guessed password away from the invoices behind it, and the AI bill has no ceiling.

The fix

Count attempts per account and per address, slow them down after a few, and cap the bot's spend.

Medium

Backups run, restore was never tested

The cabinet is backed up every night, but nobody has ever checked that a backup can actually be put back.

What it means for Northwind

The one morning the database is lost, the studio finds out whether the backups work. A backup you can't restore is a file, not a backup.

The fix

Restore a backup into a scratch database on a schedule and check row counts; a backup is only real once it's been put back.

Low

2
Low

Secrets printed to the logs

The cabinet writes its passwords and keys into its logs, where more people can see them than should.

What it means for Northwind

The secrets you'd rotate after a breach are already sitting in the log history, waiting to be read.

The fix

Keep secrets out of logs; redact known key shapes before anything is written.

Low

No staging, deploys from a laptop

There's only the live site. New versions go straight onto it from someone's laptop, with nowhere to test first.

What it means for Northwind

Every change is tried for the first time on real clients. A bad release is live until someone's laptop fixes it.

The fix

Add a staging copy, deploy from a pipeline, and keep the last good release to roll back to.

Take it with you

Not sure this could happen to you?

That's what the call is for. Tell me how your product works, and I'll tell you what applies to you and what I'd check first.