All roadmaps

Full-stack and frontend developers

Secure web application development

Browser-facing risks: output encoding, cross-site requests, redirects, uploads and the sign-in flow. Finishes with reviewing whole features the way a security reviewer would.

0/10 labs solved0%
Start roadmap
  1. 1

    Output and navigation

    Render user content safely and only redirect where you intend.

    0/3
  2. 2

    Requests the user did not mean to send

    Defend state-changing endpoints against cross-site request forgery.

    0/1
    • Fix a CSRF token check

      The API has double-submit CSRF protection, but the check lets requests without a token through. Close the gaps.

      Not solved
  3. 3

    Sign-in and account recovery

    Build a login and password-reset flow that does not leak or hand over accounts.

    0/3
    • Review a pull request: login endpoint

      A rewrite of the login route adds logging and a remember-me cookie. The password check is fine — almost nothing else is.

      Not solved
    • Fix predictable password-reset tokens

      Reset tokens come from Math.random() and the clock, and stay valid for a week. Make them unguessable and short-lived.

      Not solved
    • Fix password storage

      Passwords are stored as unsalted MD5. Replace it with a salted, slow key-derivation function and a constant-time check.

      Not solved
  4. 4

    Files and features

    Review complete features for the defects that tests rarely catch.

    0/3
    • Review a pull request: ticket attachments

      Customers can now attach files to support tickets. Upload handling is one of the riskiest features to get wrong — review it.

      Not solved
    • Review a pull request: customer API

      A backend PR adds customer search, bulk export and support password resets. Find every security defect before it merges.

      Not solved
    • Review a pull request: validation helpers

      New validators for sign-up and search. Some regexes take exponential time on the right input. Find them.

      Not solved