Skip to content

Learn

Eight tracks

Every lesson has a live application and a console beside it. Every claim the prose makes is a request you can send, and the two builds are always one click apart.

Injection

0 / 4

What is this handing to an interpreter?

A query built by joining strings, a command built the same way, and the parameterised forms that make both defects impossible rather than unlikely.

Output encoding

0 / 3

Where do these bytes actually end up?

The four contexts a value can land in, why one escaper cannot serve all of them, and why sanitising on the way in is the wrong layer.

Authentication and sessions

0 / 5

Who does this think you are, and why?

Cookies and their flags, fixation, tokens that verify the wrong thing, and the two responses that should be identical and are not.

Access control

0 / 3

Is this asking whether you may, or only who you are?

Object references, roles, forged requests and bodies written wholesale — the class of defect no scanner finds and no test suite catches.

Files and paths

0 / 2

Which file does this path actually name?

Joining, normalising, and the order those two happen in. Uploads, content types, and the resolver that checked a different path than it read.

Requests outward

0 / 2

Where is this request going, and who chose?

The server as a confused deputy: fetching what it was told to, redirecting where it was pointed, and why deny-lists lose.

Secrets and configuration

0 / 2

What is this telling you that it should not?

Serialising a whole record, logging a whole request, and the error page that is a reconnaissance tool.

Reading a generated handler

0 / 0

Clean, commented, tested — and wrong where?

The thesis track. A handler a model produced: idiomatic, well named, plausibly commented, green suite, and wrong in one specific place. Find it, name it, prove it, fix it.

Go to /audit