Point
You prove the hostname is yours — a TXT record we give you, or a file we ask you to serve — and then point the name at SelfSec instead of your origin. Nothing is installed and your application code stays exactly as it is.
Follow the complete enforcement path: managed rules, signed virtual patches, request and response inspection, bot mitigation that injects nothing into your pages, and live evidence naming the rule behind every decision.
Each stage produces evidence for the next, keeping the workflow understandable from first contact to final action.
You prove the hostname is yours — a TXT record we give you, or a file we ask you to serve — and then point the name at SelfSec instead of your origin. Nothing is installed and your application code stays exactly as it is.
Protection starts in detection mode. Every decision the firewall would have made is recorded and nothing is refused, so you see what enforcement would do to real traffic before it does it.
When you say so, a site moves to blocking — a runtime change in the engine, not a redeploy. Clean traffic reaches your origin; blocked traffic gets an enforcement response with the matched rule recorded against it.
If a rule is wrong for your application, tell us and we correct it for you without giving up the rest of the set. Making that correction yourself is not in the console yet — it is on the roadmap.
Baseline
Metered per request, per rule and per add-on, so the bill grows exactly when you are under attack. A customer's checkout gets refused and the rule that did it stays inside a black box — along with someone else's JavaScript, now running on your pages.
SelfSec
One flat price, however many sites you protect and however much traffic they take. Every block names the rule behind it, a wrong rule is a correction we make on your word rather than a ticket into a black box, and enforcement only starts when you decide it should. Nothing is injected into your HTML.
Block the attack before it reaches your app
Inspect the request, and inspect the answer
Bot mitigation that puts nothing on your page
Prove the name, point it, and we operate the rest
See what was blocked, and what was never recorded
3 capabilities in this category
A curated core rule set spans 12 categories across 11 sets we enable independently: SQL injection, cross-site scripting, path traversal, local and remote file inclusion, OS command injection, remote code execution, server-side request forgery, XML external entities, NoSQL injection, HTTP protocol anomalies and known scanner fingerprints. Rules read the path, every query name and value, every header, every cookie and the body — so a payload hidden in a cookie is not a payload that got through.
Representative output
path · query names and values · headers · cookies · body
A virtual patch shields a known-vulnerable route in front of your origin while the application fix is written, tested and shipped. The part that usually goes unexamined is how the patch arrives: here a rule bundle is signed, and the firewall verifies that signature against an operator-pinned ECDSA P-256 or RSA public key before a single rule from it is applied. The distribution host does not have to be trusted, and rules already on disk always win an identifier collision.
Representative output
unsigned or mis-signed bundle → rejected, previous rules kept
Sliding-window rate limiting runs per client address, with separate budgets for the routes that deserve them, so a login endpoint and a static asset prefix are not measured with the same ruler. Repeat offenders earn an automatic temporary ban rather than being throttled forever, and allow lists and deny lists take CIDR ranges in both IPv4 and IPv6. Allow-listing always wins, including over imported threat-intelligence ranges — the list kept for your site is the one that decides.
Representative output
the allow list for your site outranks every feed we import
3 capabilities in this category
Almost every firewall stops at the request. Response-side data-loss prevention reads what your application is about to send: payment card numbers, national identity numbers, AWS access keys and passwords embedded in connection strings are masked before the response leaves, with the content length corrected so nothing downstream breaks. A response carrying a PEM private key is not masked — it is discarded and the client gets a refusal. Stack traces, database error codes and framework error pages are recorded so you find out that a route is leaking internals before someone else does.
Representative output
card number masked · private key never leaves the building
A rule that only matches clean input is a rule that catches nobody. Requests are normalized before inspection — URL decoding, plus-to-space handling for query and form data, case folding — so double-encoded, mixed-case and percent-obfuscated payloads meet the same rule as the plain ones. The evasion suite is a regression test, not a claim: shipped rules are held to a dedicated set of encoded and mutated payloads that must still match, and clean traffic that must still pass.
Representative output
double-encoded payload → decoded → same rule, same verdict
Signature matching asks whether a request looks malicious. Schema validation asks a better question: is this request one your API ever said it would accept? Give the firewall your OpenAPI 3 document and it compiles operation-level checks at startup — unknown paths, methods your specification does not declare, query parameters that are not in the contract, content types you never published. JSON Web Tokens are validated at the edge with HS256, RS256 and ES256, and because acceptance is decided by the key material you provide, the none algorithm is not a bypass that exists here.
Representative output
the contract you published becomes the contract that is enforced
2 capabilities in this category
Every mainstream bot product works by putting someone else's JavaScript on your pages, which means another origin your users connect to, another vendor in your privacy policy and another thing that can break your checkout. SelfSec does not rewrite your HTML. When a client scores high enough on bot heuristics and is asking for a page, it gets a self-contained proof-of-work interstitial served by the firewall itself — no external request, no CAPTCHA provider, no tracking. Passing it sets a signed clearance cookie bound to that client. Being honest about the limit: this filters clients that will not run JavaScript; a determined headless browser will pass it.
Representative output
your HTML is forwarded untouched — the challenge is served instead of your page, never inside it
A well-built bot will send a perfect browser user-agent. What it finds much harder to fake is the shape of its TLS handshake. The firewall reads the real client hello at the connection layer and computes JA3 and JA4 fingerprints, which are attached to the request and recorded on every threat event — so a client claiming to be Chrome while negotiating TLS like a Go program is visible as exactly that. Header-shape heuristics cover the rest: missing accept headers, implausibly thin header sets, browser claims without the metadata a real browser sends.
Representative output
the handshake is harder to fake than the user-agent string
2 capabilities in this category
You prove the hostname is yours — a TXT record we hand you, or a file we ask you to serve — and protection starts when the name resolves to SelfSec instead of your origin. There is no package to download, no server to provision and no agent inside your application. Because the firewall sits in front of your stack rather than inside it, it does not matter whether your site runs on Windows, Linux, a managed host or a platform you do not control. Rules, updates and tuning are operated by SelfSec, and the next site you protect is another verified name rather than an infrastructure project.
Representative output
prove the name → point the record → protection is live
The reason teams put off deploying a firewall is the fear that it refuses a real customer on day one. So it does not start enforcing. A protected site begins in detection mode: every decision the firewall would have made is recorded, nothing is refused, and you read the log for as long as you need. Moving to blocking is a runtime change in the engine rather than a redeploy, and it reverses the same way, without dropping a connection. Corrections are surgical rather than all-or-nothing too — one rule, one path, one parameter — but today they are ours to make on your word rather than switches in your console. Putting that surface in your hands is on the roadmap.
Representative output
wrong rule for your app → tell us, and the rest of the set keeps enforcing
3 capabilities in this category
The console lists your protected deployments with live counters and shows the threat feed behind each one: time, client address, method and path, the reason it was stopped, the severity, the rule identifiers that matched and the JA3 and JA4 fingerprints of the client — filterable by severity, by whether the request was actually blocked, and by path. Reporting is near-real-time in the honest sense: batched and measured in minutes, not a live socket.
Representative output
every block carries the rule that made it
A firewall sees every authorization header, every session cookie and every API key your users send. The safest way to handle that evidence is to never keep it. When a rule matches inside a sensitive header or a cookie, what is recorded is the string [redacted] — in the event store, in exports, in the log stream and in outbound alerts alike. Everywhere else the matched fragment is kept — capped at 120 characters, because a decision you cannot see the evidence for is a decision you cannot appeal — so what reaches your console is enough to judge an event and never a credential.
Representative output
the evidence field for a sensitive header is the literal string [redacted]
The component that reads your traffic has 0 third-party dependencies — it is the platform's own standard library and nothing else, held to 525 automated tests. That matters for two reasons. A supply-chain compromise needs a supply chain to compromise, and a rule that catastrophically backtracks cannot stall your traffic, because every rule runs under a 100 ms match ceiling and a rule that exceeds it is abandoned for that field rather than allowed to hold the request.
Representative output
a rule that misbehaves is dropped for that field · 100 ms ceiling, always
Putting a firewall in front of an application is a choice about who processes your traffic and who carries the operating work. SelfSec is on the managed side of that line, and the table says so. Every claim below links to the source it came from.
| Capability | SelfSec WAF | Cloudflare WAF | OWASP CRS on Coraza |
|---|---|---|---|
| Deployment model | Managed reverse proxy in front of your originSource | Managed service on the vendor's global networkCloudflare WAF page (opens in a new tab) | Open-source engine you deploy as proxy, sidecar or libraryCoraza project (opens in a new tab) |
| Where requests are inspected | On SelfSec infrastructure, before forwarding upstreamSource | At the vendor edge the traffic is routed throughCloudflare WAF page (opens in a new tab) | Wherever you run the engineCoraza project (opens in a new tab) |
| Who maintains the rules | SelfSec, applied across every protected siteSource | Vendor security team, deployed network-wideCloudflare WAF page (opens in a new tab) | OWASP community ruleset you tune and operateOWASP CRS (opens in a new tab) |
| Virtual patching | Managed patch shields a vulnerable route; bundles are signed and verified against a pinned key before they applySource | Published as a CVE-blocking use caseCloudflare WAF page (opens in a new tab) | You author and maintain the ruleOWASP CRS (opens in a new tab) |
| Where enforcement starts | Detection mode first; a site moves to blocking when you ask, as a runtime change rather than a redeploySource | Managed ruleset actions are changed through overridesCloudflare managed rules (opens in a new tab) | Detection-only or blocking, configured by youOWASP CRS (opens in a new tab) |
| What a block tells you | The rule identifiers that matched, the severity, the reason and the request, with sensitive headers recorded as redactedSource | Managed rules are configured by override; rule expressions are not documented as customer-visibleCloudflare managed rules (opens in a new tab) | Rules are open source and readable in fullOWASP CRS (opens in a new tab) |
| Bot mitigation on your pages | A self-contained challenge served instead of your page; nothing is added to your HTMLSource | Challenges work by evaluating client-side signals in the visitor's browserCloudflare challenges (opens in a new tab) | Outside the rule set's scopeOWASP CRS (opens in a new tab) |
| Response DLP and schema validation | Premium tiers mask leaked secrets on the way out and validate requests against your OpenAPI contractSource | Not covered on the WAF product pageCloudflare WAF page (opens in a new tab) | Outside the rule set's scopeOWASP CRS (opens in a new tab) |
| What you set up | Hostname verification, then point the name at us; nothing installedSource | Nameserver change; CNAME setup on Business and aboveCloudflare onboarding docs (opens in a new tab) | You deploy and operate the engine yourselfCoraza project (opens in a new tab) |
| Published buying basis | One flat monthly price, unlimited sitesSource | Free, $25/mo Pro, $250/mo Business, contract tierCloudflare plans (opens in a new tab) | Free and open sourceCoraza project (opens in a new tab) |
| What you take on | Your traffic passes through SelfSec infrastructureSource | Your traffic and TLS traverse the vendor networkCloudflare WAF page (opens in a new tab) | Engine, rules, tuning and observability are yoursCoraza project (opens in a new tab) |
This compares deployment and operating models from published product information. It is not a detection benchmark, and free software carries operating cost rather than no cost. Verified July 25, 2026.
Join the launch list for product availability and deployment guidance.