Skip to content

vigilant-heronScreen web requests before they reach your sites

A reverse-proxy router with nginx-style configuration. It blocks known attacks with fixed rules, asks a decision model about everything else, and lets ordinary traffic through.

vigilant-heron

Why vigilant-heron? ​

Most attacks on a web application follow patterns that do not occur in ordinary traffic. A UNION SELECT in a query string, or a request for /.env, has one purpose. The application still receives them, and it has to decide what to do with each one. vigilant-heron stands in front of the application and makes that decision first.

It does not try to be a perfect filter. It blocks the requests that are clearly malicious, and it lets everything else pass. When the decision model cannot answer, the router lets the request through by default, so a model outage does not take your site down.

Without vigilant-heronWith vigilant-heron
GET /?id=1 UNION SELECT password FROM users reaches the applicationBlocked with 403 by rule vh-sqli-001, without asking the model
GET /.env reaches the application, which may return its contentsBlocked with 403 when the site has deny_path /.env;
A prompt-injection payload in a request to an AI endpoint is forwardedThe model scores it on ai_instruction, and a score at or above instruction_threshold (0.8 by default) blocks it
One address sends 500 requests a second, and all of them reach the applicationA limit_req zone refuses the excess with the status you set, such as 429
The decision model is downRules still block the attacks above. A request the model cannot judge is let through, which is the default (on_decision_error allow)
  • Ordinary requests pass. A request is blocked only by the access list, a limit, a rule, or a score above a threshold.
  • Shadow mode first. A new site records its decisions in the log before anything is blocked.
  • Failures are visible. Each access line records the decision, the reason, and any decision error.
  • Your own rules. Add a rule block for a pattern that only your application has.

Rules ​

The router ships with built-in rules. Each rule has an id such as vh-sqli-001, and each is turned off with disable_rule if it does not fit your application.

CategoryExamples
SQL injectionUNION SELECT in a query string, a quote with a tautology, a stacked DROP
XSSA <script tag in a query string, a javascript: URL, an inline event handler
Path traversal../ sequences in a query string or the path, etc/passwd, win.ini
Command injectionA shell separator followed by cat, id or whoami, a $( substitution
File inclusionPHP stream wrappers such as php://filter, a remote URL in a file or page parameter
SSRFThe cloud metadata address 169.254.169.254, gopher:// and file:// URLs in a query string
Template and expressionThe Log4Shell lookup ${jndi:, the 49 probe
XML external entitiesAn entity declared with SYSTEM in a request body
Known scannersThe user agent of sqlmap, nikto, nuclei, masscan and similar tools

View all built-in rules β†’

Released under the MIT License.