A full comparison of attack surfaces: what WordPress exposes, what this build removes, and how HTTPS, edge delivery, and a controlled dev workflow change the security posture.
Security on the web is mostly about reducing what an attacker can reach. A WordPress site has a public admin login, a live PHP application, a connected database, and a plugin ecosystem that must be continuously patched. A Next.js site on Vercel removes most of those surfaces for the public-facing site: no admin panel, no plugin runtime, no live database behind static pages, and no server for you to patch by hand.
Private work—editing, deploying, secrets—lives in authenticated developer tooling (Cursor, Git, Vercel's environment variables), not in a browser-facing login form that a bot can try a million passwords against.
WordPress powers a significant portion of the web, and for that reason it is also the most targeted CMS by automated scanners and attackers. A default WordPress install exposes several points of entry that a Next.js build simply does not have.
The admin dashboard at /wp-admin is publicly reachable by anyone who knows the URL. Brute-force tools run credential-stuffing attacks against it continuously. Every site running WordPress has this problem unless the admin URL is hidden or IP-restricted, which requires additional configuration that many site owners never complete.
The PHP application running on the server must be kept updated, as must each plugin. A single unpatched plugin—even a legitimate, well-regarded one—can introduce a remote code execution or SQL injection vulnerability. Because plugins are installed from a marketplace and can be abandoned by their authors, this is an ongoing maintenance risk, not a one-time setup.
The MySQL database is a live, writable store connected to the running application. SQL injection attacks against insufficiently sanitized input can read, modify, or delete content. The database credentials live on the server, and a server compromise means those credentials are exposed.
There is no /wp-admin or equivalent. The site has no public login panel for content editing. Content changes go through the developer workflow in Cursor and Git—not through a browser-facing admin that a bot can probe with a credential list.
There are no PHP plugins. This project has no WordPress plugin graph. Dependencies are standard npm packages declared in package.json, updated through normal package management, and audited with tools that flag known vulnerabilities in the dependency tree.
For static pages (the majority of public-facing content), there is no database involved in serving a response at all. A visitor reading a page gets a pre-built file from Vercel's edge, not a document assembled by querying a live database. There is nothing to inject into.
Secrets—API keys, database credentials, third-party tokens—live in Vercel's environment variable store, not in configuration files in the public web root. They are never embedded in the client-side bundle delivered to the browser.
Every Vercel deployment, including preview URLs on branches, is served over TLS (HTTPS) automatically. There is no certificate purchase, renewal reminder, or Let's Encrypt script to maintain. The browser's secure connection indicator is on from the first deploy.
Traffic between visitors and Vercel passes through Vercel's edge infrastructure, which can absorb large volumes of requests and apply rate limiting at the network layer before traffic reaches application code. This provides a baseline layer of DDoS mitigation that a self-hosted server on a single IP address does not have.
HTTP security headers (Content-Security-Policy, X-Frame-Options, Referrer-Policy, and others) can be set in the Next.js configuration and applied globally across all routes without touching a server config file. They are version-controlled alongside the rest of the code.
Editing the site requires access to the Cursor IDE on a developer's machine and write access to the Git repository. That is a controlled, authenticated path—not a web login form exposed to the public internet.
Git hosts (GitHub, GitLab, and similar) provide two-factor authentication, signed commits, branch protection rules, and audit logs as standard features. The history of every change to the site is recorded and attributable.
Deploy keys and environment variables on Vercel are scoped to the project and not visible after they are set, even to team members with viewer access. A compromised credential does not automatically yield access to the production site's secrets.
Features that require stored data (form submissions, user accounts, dynamic content) connect to a database through Next.js API routes or Server Components running on the host—never directly from the browser. Visitors cannot send raw SQL to the database. Queries are parameterized in application code before they reach the database layer.
Using a managed database provider (Supabase, Neon, PlanetScale, or similar) means the database host itself is patched, backed up, and monitored by a dedicated team rather than a single developer maintaining a server. Row-level security rules can restrict what each authenticated user is allowed to read or write.
Connection strings and database credentials are stored in Vercel environment variables. They are available to server-side code at runtime but never shipped to the client bundle, and they never appear in the Git repository.
A folder of static HTML files on a shared host is small in attack surface in the same way—there is no CMS login, no running application to exploit. The difference is in the hosting control plane and the development workflow.
Shared hosting typically comes with a cPanel or similar web admin, FTP access, and a phpMyAdmin interface—all of which are frequently targeted and require the site owner to keep credentials and software updated. A Next.js site on Vercel removes that layer entirely: there is no cPanel, no FTP, and no PHP environment to misconfigure.
Adding dynamic features to a static HTML site usually means bolting on third-party scripts (chat widgets, form services, analytics) loaded from external domains, each of which introduces a supply-chain risk. A Next.js app handles those integrations in controlled server routes or vetted npm packages rather than arbitrary scripts injected into the page head.
Want to explore more about how this site is built?