All case studies
Case Study
Code Security Review

How We Reviewed 26 Code Repositories and Pushed 17 Security Fixes: Complete Case Study by AurixLab

We reviewed 26 code repositories and pushed 17 security fixes in one review. The goal was to close weak points before an attacker finds them. The work covered client products and our own internal tools.

Client products and internal tools · Code review
Graphic of 26 code repositories reviewed, 17 of them with security patch commits
Project overview
Review detailSummary
Review dateOctober 26, 2026
Scope26 repositories: client products and internal AurixLab tools
Project typesOperations platform, Shopify integrations, therapy intake, clinic sites, careers form, automation tools
Tech coveredNext.js, Fastify, Vite, Shopify, Supabase, Google Sheets, PHP, Python
Output17 pushed patch commits across 117 changed file entries

AurixLab's web development and SEO teams worked on this project together. The web development and cybersecurity team reviewed the code and wrote the fixes. The SEO team documented the work in this case study.

Results

  • 17 repositories received security patch commits
  • 9 more repositories reviewed, with findings logged for follow-up
  • Dependency audit findings cut from 20 to 12 on one platform
  • Dependency audit findings cut from 17 to 7 on a script engine
  • 0 known dependency findings left on a Shopify quote API

Why Review Code That Already Works

Code that works can still trust the wrong things. A form can accept a dangerous value, and a webhook can accept a fake message. A secret can sit in a file anyone with repository access can read.

Our other 2 case studies cover attacks already in progress. One stopped spam bots on quote forms, and one recovered a hacked clinic website. This review shows the preventive side.

A breach can also cost a business its search visibility. Secure code protects the rankings that our SEO services in Calgary work to build.

How the Review Worked

The team followed 5 steps: discover, prioritize, fix, verify and maintain.

  1. Discover. The team mapped each product's risk points: accounts, forms, third-party APIs, hosting and sensitive data.
  2. Prioritize. High-impact threats went first, such as unprotected routes and exposed secrets.
  3. Fix the right boundary. Each fix went where the risky action happens, usually on the server.
  4. Verify. The team ran syntax checks, npm and pnpm dependency audits, and manual code tracing.
  5. Maintain. Every unfinished item went on a follow-up list with a clear next step.

The team picked controls to fit each product. A static site and an app that stores client data need different protection.

What the Team Fixed: Six Themes

The 17 fixes fall into 6 themes, each aimed at a different attack.

1. Login and Access Control

Sensitive actions now check permission on the server as well as in the interface. Someone can still call a hidden page directly.

  • Route checks: report and scheduled-task endpoints now need a valid session or secret.
  • Revocable sessions: the server confirms each session is still active, so disabled accounts lose access.
  • Random setup passwords: new accounts get random passwords instead of predictable defaults.
  • Safer shared passwords: one tool replaced a raw password cookie with a derived token.
  • Login limits: an app without a login throttle now limits repeated attempts.

2. APIs and Integrations

Connected services now prove who they are before the code acts.

  • Webhook signatures: Shopify event handlers now verify each message's HMAC signature and reject unsigned ones.
  • Narrow proxies: an older commerce proxy now allows only set request methods and paths.
  • Secrets out of code: committed credentials moved into environment and platform settings.
  • Quieter errors: selected integrations stopped showing internal error details to visitors.

3. Unsafe Input

The code now checks or encodes outside data before using it.

  • Cross-site scripting (XSS): Webflow, landing-page and Shopify review code now handles text safely.
  • Formula injection: the careers form now stores spreadsheet-like entries as plain text in Google Sheets.
  • Redirect safety: login redirects reject unexpected targets, and stored links must use HTTP(S).
  • Email and query injection: email subjects, attachment names and contact headers are now cleaned.

4. Server-Side Requests and Files

User-supplied values now face limits before the server acts on them.

  • Request forgery controls: a product scraper now rejects private addresses and rechecks every redirect.
  • Safe file names: form attachments get cleaned names and a cap on file count.
  • Media checks: a therapy intake flow now inspects the audio data itself.
  • Locked settings: a routing tool no longer lets local project files pick privileged paths.

5. Dependencies and Build Tooling

Outdated packages and loose build steps now get the same attention as app code.

  • Package updates: the team updated selected Next.js, Fastify, Vite and image-processing packages.
  • Pinned CI actions: third-party GitHub Actions in sensitive workflows now point to exact revision hashes.
  • File integrity checks: a multi-page clinic website now checks pinned CDN files for unexpected changes.

6. Resilience

Limits now stop uploads and background jobs from overloading a system.

  • Bounded uploads: attachments, audio files and design images now have size or count limits.
  • Job controls: a review-refresh job now has a concurrency group and a time limit.
  • Local-only dev server: an internal development server no longer exposes itself to the wider network.

Dependency Audit Results

Dependency audit findings dropped on 2 projects and reached 0 on a third. These counts come from package audits run during the review.

ProjectFindings beforeFindings after
One platform2012
Script automation engine177
Shopify quote APINot recorded0 known findings

These counts cover known package advisories at one point in time. They are not a full security score for each product.

The review also changed 117 file entries, with 2,396 lines added and 1,970 removed. Regenerated lockfiles make up much of that, so it overstates the hand-written fixes.

Where the 17 Fixes Landed

The 17 patch commits spread across client products, clinic work and our own tools. Projects appear by function, not by client name or repository.

ProjectSecurity changes
Agency operations hubReport and scheduled-task permission checks; session checks; URL-fetch controls; security headers; package updates
Client dashboardSafer post-login redirects; package updates; pinned CI actions; new regression tests
Content and script automation engineEscaped database-filter values; restricted stored links; response headers; package patches
Commerce integration serviceWebhook signature checks; credentials moved out of code; guarded utility endpoints; fewer error details
Purchase-order search toolDerived cookie token; login throttling; safer comparisons; response headers; updated packages
Shopify quote APICleaned attachment names and subjects; file limits; no public error detail; patched packages
Clinic public pagesHardened PHP contact email fields and error display; integrity checks on pinned assets
Therapy matching and intakeAudio content checks; bounded reads; container ownership fix; Python package updates
Agency careers formSpreadsheet formula input neutralized; field length limits; protected role lookup
Clinic education micrositePath containment; local-only dev server; escaped animated text; package cleanup
Agency Webflow componentsSafe page construction instead of risky HTML insertion; updated packages
Routing configuration utilityUntrusted project settings blocked from privileged paths and endpoints
Ad research utilityPreview URLs and file IDs validated before image downloads
Campaign order webhookLess sensitive third-party error logging
Commerce review refreshJob concurrency and timeout controls
Archived commerce proxyCredentials moved out of code; limited methods and endpoints; stronger webhook checks
Retired commerce themeHardcoded image API key removed; third-party review text encoded

The team also reviewed 9 repositories without making commits. Some needed decisions from their owners, such as a privacy choice about a public file. Others showed little exposure, such as a static asset project.

What We Do Not Claim

A pushed patch is not the same as a tested, deployed fix. The review records changes in source control. Each live product still needs its own deployment and testing.

Proof typeWhat it showsWhat it does not prove
Source-control commits17 security fixes written and pushedThat each fix is live in production
Syntax and dependency checksCode parses; known package advisories droppedThat every feature still works end to end
Manual code tracingLogin, webhook, URL and settings paths reviewed by handFull exploit coverage or independent certification

The team uses 3 levels of "done":

  • Implemented: the change sits in the codebase or on the live platform.
  • Verified: someone observed specific evidence in a stated environment.
  • Operationally closed: deployment, credentials, settings, regression checks and ownership are all confirmed.

Not every project in this review has reached the third level yet.

Follow-Up Work

Security is a maintained condition, so every open item has a next step.

  • Rotate old credentials: removing a secret from code does not remove it from Git history.
  • Deploy and test: rebuild affected projects and confirm the live handlers behave as expected.
  • Run full regression checks: run builds, browser tests and critical-path checks outside this review.
  • Keep runtimes current: confirm hosted runtimes, such as Node.js, stay on patched releases.

Four Lessons for Teams That Ship Software

Four lessons from this review apply to any business that runs custom web software.

  1. Check permission where the action happens. A hidden button does not protect the route behind it.
  2. Treat every outside value as untrusted. Form fields, URLs, file names and webhooks all need checks.
  3. Keep secrets out of code. Store them in environment settings, and rotate any secret that was ever committed.
  4. Audit small tools too. A careers form can open the same doors as a flagship app.

We can build security checks into design, development and maintenance. This work is part of AurixLab's web design and development services in Calgary. Book a free 30-minute growth mapping call to start.

Frequently Asked Questions

What Is a Code Security Review?

A code security review checks an app's source code for weak points attackers could use. Reviewers look at logins, permissions, inputs, secrets, integrations and outdated packages. In our reviews, every finding gets either a fix or a logged follow-up. The review covers client products and internal tools alike.

How Is a Code Review Different From a Penetration Test?

A code review reads the source to find and fix weak points from the inside. A penetration test attacks a running system to show what an attacker can exploit. This project was a code review, so it makes no penetration test claims.

What Is Webhook Signature Verification?

Webhook signature verification confirms that a message really came from its claimed sender. Shopify signs each webhook with an HMAC signature. The receiving code recalculates that signature and rejects any message that does not match. That check blocks fake orders and events.

Why Pin GitHub Actions to Exact Revisions?

A version tag on a GitHub Action can change after you start using it. If someone tampers with that tag, your workflow runs the new code. An exact revision hash locks the action to one reviewed version. That step reduces supply-chain risk.

Does Removing a Secret From Code Make It Safe?

No. A secret deleted from the latest code still sits in the repository's Git history. Anyone with access to that history can still find and use it. The fix is to move it into environment settings and rotate the old one.

Have a project
idea in mind? Let's get started

  • Expect a response from us within 24 hours
  • We're happy to sign an NDA upon request.
  • Get access to a team of dedicated product specialists.
Shardar Quraishi - Founder & CEO

Shardar Quraishi

Founder | CEO
Web Design & Development
Growth Marketing
Content & Film Production
AI & Automation
Full-Service Retainer
< $5,000
$5,000 - $15,000
$15,000 - $30,000
$30,000 - $50,000
$50,000+
Send inquiry
Thank you! Your inquiry has been received. We'll respond within 24 hours.