<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged checklist</title>
<link>https://coderlegion.com/tag/checklist</link>
<description>Powered by Question2Answer</description>
<item>
<title>How to Use a WAF with Let's Encrypt Automatic HTTPS Without Guessing Renewal</title>
<link>https://coderlegion.com/32622/how-to-use-a-waf-with-lets-encrypt-automatic-https-without-guessing-renewal</link>
<description>&lt;p&gt;Checking an SSL option is not the same job as renewing a certificate. If the goal is to use a web application firewall together with Let's Encrypt automatic HTTPS, I separate those jobs before I change DNS. The SafeLine pages available for this guide describe a self-hosted reverse-proxy WAF, an application form, and an SSL checkbox for HTTPS apps. They do not describe an ACME client, a Let's Encrypt account, HTTP-01 routes, DNS-01 hooks, or a renewal schedule. This is a decision checklist for that gap. It is not a claim that SafeLine issues or renews certificates for you.&lt;/p&gt;
&lt;p&gt;SafeLine is placed in front of a web application. Clients talk to the WAF, and the WAF forwards traffic it considers safe to the origin. The introduction describes that role as a reverse proxy, which is different from a forward proxy that hides a client. Documented attack coverage includes SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoors, brute force, HTTP flood, and bot abuse. The same page lists web-attack defense, proactive bot-abuse defense, HTML and JavaScript code encryption, IP-based rate limiting, and a web access control list. Feature descriptions also cover rate limiting, CAPTCHA challenges, an authentication challenge that asks visitors for a password, and dynamic protection that encrypts HTML and JavaScript on each visit. None of those controls is a certificate authority. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That split is the whole point of the checklist. A certificate lets browsers trust the name on the public listener. A WAF policy decides which requests may continue. Automatic HTTPS fails when port ownership, challenge reachability, or certificate storage is assumed instead of tested. Attack filtering can still look healthy on the day renewal breaks.&lt;/p&gt;
&lt;p&gt;I walk through six decisions before the cutover.&lt;/p&gt;
&lt;p&gt;Decide who owns the public ports. The application guide says you set a domain, a listen port such as 80 or 443, and an upstream address. For HTTPS apps, you check the SSL option. After saving, you resolve the domain to the IP of the server running SafeLine. If that server becomes the only public answer for the name, any renewal agent left on the old origin may stop seeing inbound challenges. Write the current listener down before you edit DNS. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Decide where the visitor certificate is presented. The SSL option tells the proxy to handle HTTPS on the listen port. The supplied text does not say the product requests a certificate, stores an account key, or renews one. Until you confirm newer documentation, plan to present a certificate you already know how to obtain, or keep issuance on a host that can still complete the challenge. Do not read automatic HTTPS into a checkbox.&lt;/p&gt;
&lt;p&gt;Map the renewal method to a path that survives the proxy. Let's Encrypt automation commonly uses the ACME protocol. HTTP-01 looks for a token on port 80. TLS-ALPN-01 uses a special handshake on port 443. DNS-01 publishes a TXT record and does not need the WAF to pass an HTTP token. None of these methods appears as a SafeLine feature in the sources used here. If your automation is HTTP-01 and the WAF takes port 80, renewal can fail while the current certificate still serves. Run a renewal test before the live certificate is close to expiry, and keep the old listener available until that test passes.&lt;/p&gt;
&lt;p&gt;Decide the upstream hop separately. SafeLine forwards cleaned traffic to the real address you enter as upstream. The guide does not require that hop to be HTTPS, and it does not document automatic certificates for the origin. If the origin sits on a private network, HTTP on that hop may be acceptable to you. If you need encryption to the origin, configure and verify that yourself. Record the choice. Do not inherit it from the public SSL option.&lt;/p&gt;
&lt;p&gt;Confirm the WAF host is actually a supported place to terminate traffic. The deploy guide requires Linux, x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, at least 1 CPU core, 1 GB of memory, 5 GB of disk, and SSSE3. Installation can follow the documented automatic command or a manual Compose layout, with configuration and data written under a directory you create, commonly /data/safeline. The web console is then opened at &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt; unless you change the management port. An ARM install needs a Pro license; the Personal Edition is not supported on ARM. The LTS release line is no longer maintained starting from 9.1.0-LTS on 14 August 2025. Those constraints tell you whether this host should be the public HTTPS endpoint. They do not add issuance. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Prove filtering only after the HTTPS path is real. The application guide lists sample probes for SQL injection, XSS, path traversal, code injection, and XXE, then tells you to inspect the attack list and open a detail view. Use a domain you control. A block page shows that inspection is active. It does not show that the next certificate renewal will succeed.&lt;/p&gt;
&lt;p&gt;My order is install, log in through the administrator account from the documented docker exec safeline-mgt resetadmin step, add the application, check SSL only when a certificate is ready for that listener, point DNS at the SafeLine host, then test both a malicious request and a renewal. If the renewal client cannot complete its challenge, stop. Designs that do not require an undocumented SafeLine integration include moving renewal to DNS-01, or keeping the challenge listener with the automation you already run, and moving visitor traffic only after a renewal test passes. Pick a design you can test. Do not add an issuance command. These documents do not provide one.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-issue-or-renew-let-s-encrypt-certificates-&quot;&gt;Does SafeLine issue or renew Let's Encrypt certificates?&lt;/h4&gt;
&lt;p&gt;Not based on the documents used here. They cover reverse-proxy filtering, application fields, and an SSL option for HTTPS apps. They do not document ACME, Let's Encrypt, or automatic renewal. Keep certificate lifecycle in a process you can already explain.&lt;/p&gt;
&lt;h4 id=&quot;is-the-ssl-checkbox-the-same-as-automatic-https-&quot;&gt;Is the SSL checkbox the same as automatic HTTPS?&lt;/h4&gt;
&lt;p&gt;No. Checking SSL means the application should be served over HTTPS on the listen port you chose. Automatic HTTPS also needs a certificate, a private key, a renewal method, and a working challenge. The application guide does not tie the checkbox to a certificate authority.&lt;/p&gt;
&lt;h4 id=&quot;what-fails-if-dns-moves-before-a-renewal-test-&quot;&gt;What fails if DNS moves before a renewal test?&lt;/h4&gt;
&lt;p&gt;The site can keep serving the certificate you already installed, then fail on the next renewal. HTTP-01 and TLS-ALPN-01 need the public challenge to reach the client that ordered the certificate. If only the WAF answers, and no documented challenge handler exists, renewal fails even though attack logs still update.&lt;/p&gt;
&lt;h4 id=&quot;does-the-upstream-have-to-be-https-too-&quot;&gt;Does the upstream have to be HTTPS too?&lt;/h4&gt;
&lt;p&gt;The docs say SafeLine receives visitor traffic and forwards safe traffic to the upstream address. They do not mandate the upstream scheme and do not describe automatic origin certificates. Choose HTTP or HTTPS for that hop from your trust boundary, then verify it. The public SSL option does not answer that question.&lt;/p&gt;
&lt;h4 id=&quot;what-should-i-verify-on-the-safeline-host-first-&quot;&gt;What should I verify on the SafeLine host first?&lt;/h4&gt;
&lt;p&gt;Check architecture, Docker version, Compose version, CPU, memory, disk, and SSSE3 against the deploy guide. Add the application with domain, port, upstream, and SSL only if HTTPS is intended. Resolve the name to the SafeLine server. On ARM, confirm a Pro license, because the Personal Edition is not supported there. Then test renewal separately from the attack samples.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32622/how-to-use-a-waf-with-lets-encrypt-automatic-https-without-guessing-renewal</guid>
<pubDate>Tue, 27 Oct 2026 02:47:17 +0000</pubDate>
</item>
<item>
<title>How to Use a WAF with Let's Encrypt Automatic HTTPS: A Cutover Checklist</title>
<link>https://coderlegion.com/32621/how-to-use-a-waf-with-lets-encrypt-automatic-https-a-cutover-checklist</link>
<description>&lt;p&gt;Automatic HTTPS sounds simple until a reverse-proxy WAF sits on the public address. Let's Encrypt can renew a certificate, but the supplied SafeLine documentation does not describe an ACME client, a certificate upload workflow, or an automatic renewal job. This guide is therefore a decision checklist, not a promise that SafeLine issues or renews Let's Encrypt certificates for you.&lt;/p&gt;
&lt;p&gt;Start by separating three jobs that are easy to mix together. The certificate authority proves control of a name and signs a certificate. The TLS endpoint presents that certificate to browsers. The WAF inspects HTTP after it can see the request. SafeLine's documented role is the third job, implemented as an HTTP/HTTPS reverse proxy: it receives traffic for the original site, filters malicious requests, and forwards trusted traffic upstream. That model is described in the application guide at &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt; and in the product overview at &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;what-the-console-actually-documents&quot;&gt;What the console actually documents&lt;/h3&gt;
&lt;p&gt;When you add an application, the console asks for a domain, a listen port, and an upstream address. For an HTTPS application, the same dialog says to check the SSL option. After that, you resolve the domain to the SafeLine server. Those fields tell you where clients will connect and where cleaned traffic goes. They do not tell you which program runs certbot, where the private key is stored, or how a renewal hook reloads the proxy.&lt;/p&gt;
&lt;p&gt;Treat the SSL checkbox as a routing requirement, not as evidence of automatic issuance. If clients use port 443, SafeLine must be the process listening there, or something in front of it must forward that port without breaking the Host header. The documented examples use 80 or 443. The management console itself is separate: the deploy guide opens it at &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt;. Do not point public site DNS at 9443 and call that application HTTPS.&lt;/p&gt;
&lt;h3 id=&quot;checklist-before-you-automate-renewal&quot;&gt;Checklist before you automate renewal&lt;/h3&gt;
&lt;p&gt;Use this order so certificate automation does not fight the proxy.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Confirm the host can run SafeLine. The deploy guide at &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt; requires Linux, x86_64 or arm64, Docker 20.10.14 or newer, Docker Compose 2.0.0 or newer, and at least 1 CPU core, 1 GB of memory, and 5 GB of disk. The CPU also needs the ssse3 instruction. On ARM, the same guide says a Pro license is required and the Personal Edition is not supported. If you planned an ARM box only because a certificate client was already installed there, fix the license and architecture question before you automate anything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose the public name clients will type. The application domain can be a domain name, a hostname, or an IP address. Let's Encrypt issuance for a bare IP is a different problem from name-based issuance, and these sources do not document either path inside SafeLine. If you need automatic HTTPS, plan the name and the renewal client outside the undocumented area, then make the presented certificate match the domain entered in the application dialog.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decide who terminates TLS. Because SafeLine is the reverse proxy clients reach, the practical default is that the public certificate is presented on the SafeLine listen port. Renewal must therefore update the material that this proxy presents, or you must put another TLS endpoint in front and still satisfy the documented DNS step. Do not assume an undocumented integration will copy certificates into the container.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep port 80 and port 443 explicit. HTTP-01 style validation generally needs a reachable HTTP challenge on port 80. DNS-01 does not. Neither method is described as a SafeLine feature. If your renewal method needs port 80, make sure the WAF listen plan does not silently capture that port without a path for the challenge. If you cannot prove that path from the current docs, run renewal on a host layout you already understand, then only proxy the finished HTTPS site.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Point DNS only after the listen port and upstream are set. The application guide says to resolve the entered domain to the SafeLine server IP, then access the protected application through that domain. Renewing against the old origin IP after this cutover will fail or, worse, validate the wrong host.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Preserve the upstream. SafeLine forwards to the real application address you enter. The origin should accept traffic from the WAF and should not require browsers to connect to it directly. If the origin also has its own certificate, that is an internal hop. These sources do not specify upstream TLS settings, so do not invent a toggle. Verify the hop with a normal request after cutover.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Turn protection on only after a clean page load. Documented controls include web-attack filtering, rate limiting, CAPTCHA challenge, authentication challenge, and dynamic HTML and JS encryption, as listed at &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;. Rate limiting is described as a defense against denial-of-service patterns, brute-force attempts, traffic surges, and other abuse. A renewal client that suddenly requests the same challenge URL, or a monitoring probe that looks automated, can trip bot or rate controls. Test a normal browser visit first, then review the attack list in the console before you tighten those controls.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;prove-the-proxy-not-the-certificate-story&quot;&gt;Prove the proxy, not the certificate story&lt;/h3&gt;
&lt;p&gt;The application guide includes intentional test requests for SQL injection, XSS, path traversal, code injection, and XXE. Replace the sample domain with yours. A block page means the request was inspected. Open the console attack list and use the detail view. A valid certificate in the browser only proves TLS presentation. It does not prove that SafeLine is on the path, and a block page does not prove that Let's Encrypt will renew next month.&lt;/p&gt;
&lt;p&gt;Also separate the management plane from the site. Administrator access is created with docker exec safeline-mgt resetadmin after installation, as documented in the deploy guide. Store that password outside any public web root used for certificate challenges. The .env file is created with restricted permissions in the manual install; do not place private keys or database passwords in a directory that an HTTP challenge client serves to the internet.&lt;/p&gt;
&lt;h3 id=&quot;what-to-record-for-the-next-renewal&quot;&gt;What to record for the next renewal&lt;/h3&gt;
&lt;p&gt;Write down four facts before you leave the change window: the application domain, the SafeLine listen port, the upstream address, and the external system that actually holds the certificate and key. Add the date you last presented a working certificate on that listen port. When renewal fails later, those four facts tell you whether the outage is DNS, the undocumented certificate handoff, the upstream, or a protection rule. The sources do not provide a SafeLine command that renews Let's Encrypt certificates, so a runbook that says the WAF renews it is already wrong.&lt;/p&gt;
&lt;p&gt;If the LTS package is in use, note that too. The deploy guide says the LTS line will no longer be maintained starting from 9.1.0-LTS on 14 August 2025, and it recommends upgrading. Certificate automation on an unmaintained proxy is a poor place to discover a reload problem.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-issue-let-s-encrypt-certificates-automatically-&quot;&gt;Does SafeLine issue Let's Encrypt certificates automatically?&lt;/h4&gt;
&lt;p&gt;The supplied install, overview, and application documents do not describe ACME, certbot, or automatic Let's Encrypt issuance. Check the SSL option for an HTTPS application, but plan issuance and renewal with a process those pages actually document or with an external client you operate yourself.&lt;/p&gt;
&lt;h4 id=&quot;where-should-the-public-certificate-be-presented-&quot;&gt;Where should the public certificate be presented?&lt;/h4&gt;
&lt;p&gt;Clients resolve the application domain to the SafeLine server and connect to the listen port you configure, commonly 443 for HTTPS. The certificate visitors see should match that name. How the key is loaded into SafeLine is not specified in these sources, so do not invent an upload or reload command.&lt;/p&gt;
&lt;h4 id=&quot;can-i-validate-let-s-encrypt-through-the-waf-&quot;&gt;Can I validate Let's Encrypt through the WAF?&lt;/h4&gt;
&lt;p&gt;Only if your chosen challenge can succeed on the path you control. These documents do not define an HTTP-01 exception, a DNS-01 plugin, or a renewal hook. If you cannot explain the challenge path without guessing a feature, terminate validation elsewhere and bring the finished certificate to the proxy through a procedure you have already tested.&lt;/p&gt;
&lt;h4 id=&quot;which-safeline-controls-can-interfere-with-automation-&quot;&gt;Which SafeLine controls can interfere with automation?&lt;/h4&gt;
&lt;p&gt;Rate limiting, CAPTCHA, and authentication challenge are documented visitor controls. A challenge client or health check can look like abuse. Confirm a normal visit and review the console attack detail before enabling stricter controls on the host that also serves renewal traffic.&lt;/p&gt;
&lt;h4 id=&quot;what-should-i-test-after-the-dns-cutover-&quot;&gt;What should I test after the DNS cutover?&lt;/h4&gt;
&lt;p&gt;Load the real site through the protected domain, confirm the certificate name matches that domain, then send the documented SQL injection, XSS, path traversal, code injection, and XXE samples with your own domain. A block page plus an entry in the attack list shows inspection. Repeat a benign page load so you also know that legitimate traffic still reaches the upstream.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32621/how-to-use-a-waf-with-lets-encrypt-automatic-https-a-cutover-checklist</guid>
<pubDate>Tue, 27 Oct 2026 02:46:45 +0000</pubDate>
</item>
<item>
<title>How to Decide Whether a WAF Belongs Behind Cloudflare or Any CDN</title>
<link>https://coderlegion.com/32620/how-to-decide-whether-a-waf-belongs-behind-cloudflare-or-any-cdn</link>
<description>&lt;p&gt;A CDN and a self-hosted web application firewall answer different placement questions. Cloudflare, or any other content delivery network, usually becomes the public name that visitors resolve. SafeLine, as documented, is a reverse proxy that is supposed to receive the application traffic before the origin does. The supplied product pages never describe a Cloudflare connector, a generic CDN origin mode, header restoration, cache bypass, or a shared certificate workflow. This article is a decision checklist for that gap. It does not turn silence in the docs into a setup procedure.&lt;/p&gt;
&lt;p&gt;Start with the traffic path the product actually documents. The home page defines a WAF as a filter and monitor for HTTP traffic between a web application and the Internet, and it says deploying a WAF in front of an application places a shield between the application and the Internet. SafeLine is described as a reverse proxy: clients pass through it before they reach the server. It filters, monitors, and blocks malicious HTTP/S traffic and is intended to prevent unauthorized data from leaving the app, using policies that separate malicious traffic from safe traffic. The listed core capabilities are defenses for web attacks, proactive bot abuse defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list. The feature list names protection against attacks such as SQL injection, XSS, code injection, OS command injection, CRLF injection, XXE, SSRF, and path traversal, plus rate limiting for DoS attacks, brute-force attempts, traffic surges, and other abuse. CAPTCHA, an authentication challenge that asks visitors for a password, and dynamic protection that encrypts HTML and JS on each visit are also documented. Those controls apply to traffic SafeLine proxies. They are not documented as rules pushed into a CDN. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The application guide then fixes the public address. After SafeLine is installed, you add an application with a domain, hostname, or IP, a listen port such as 80 or 443, and an upstream address. HTTPS apps use the SSL option. SafeLine receives traffic for the original site, cleans malicious traffic, and forwards the rest to the upstream. The following instruction is to resolve that domain to the IP of the server where SafeLine runs. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That sentence is the conflict. If visitors must resolve the name to a CDN, you are no longer following the documented public path. A CDN-in-front design would require the CDN to connect onward to SafeLine, and SafeLine to connect onward to the application. The pages do not say how to configure that hop, which certificate belongs where, or whether SafeLine will see the visitor address or the CDN address. Treat those as unknown. Do not fill them with settings copied from another product.&lt;/p&gt;
&lt;p&gt;Walk the checklist in order.&lt;/p&gt;
&lt;p&gt;Confirm the host before you argue about DNS. The deploy guide requires Linux, x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, and a minimum of 1 CPU core, 1 GB of memory, and 5 GB of disk. The CPU must support ssse3. An ARM installation needs a Pro license to work properly, and the Personal Edition is not supported on ARM. LTS is no longer maintained starting from 9.1.0-LTS on 14 August 2025, and the page recommends upgrading. A placement debate does not relax those requirements. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Separate the console from the site. MGT_PROXY is the number of proxy layers in front of the management console. It should be used only when configuring a proxy for the console, and the default is 0. The console example port is 9443. Changing MGT_PROXY does not put protected sites behind Cloudflare or any other CDN.&lt;/p&gt;
&lt;p&gt;Write the path you can still defend. Domain, listen port, SSL choice, and upstream must match the application dialog. If the public name points at a CDN, label that design custom. The only checks these sources support are reachability checks you can observe yourself: the intermediary can open the SafeLine listen port, SafeLine can open the upstream, and a test request arrives at the proxy rather than stopping at a cache.&lt;/p&gt;
&lt;p&gt;List controls that depend on the address SafeLine sees. IP-based rate limiting is a documented capability, described as throttling traffic that exceeds defined limits. The pages do not name a trusted CDN header and do not say SafeLine restores the original client address. If the only connection SafeLine sees comes from an intermediary, IP limits may apply to that intermediary. Attack inspection still requires the request to reach SafeLine. A response served from a cache never enters the documented proxy path, so it is outside the claim that SafeLine cleaned it.&lt;/p&gt;
&lt;p&gt;Close the bypass. The documented model forwards cleaned traffic to the upstream you configure. If clients can still reach that upstream directly, the proxy is optional. A CDN in front does not, by itself, remove a public origin.&lt;/p&gt;
&lt;p&gt;Retest with the cases already published, not with a new exploit catalog. The application guide gives SQL injection, XSS, path traversal, code injection, and XXE query examples and says to replace the sample host with your domain. Success, as documented, is the blocking page plus an entry in the console attack list, including the detail view. If the request never appears there, do not credit SafeLine for a block that happened somewhere else.&lt;/p&gt;
&lt;p&gt;The home page also prints an effect evaluation on 33669 samples for ModSecurity Level 1, CloudFlare Free, SafeLine Balance, and SafeLine Strict. Detection is listed as 69.74%, 10.70%, 71.65%, and 76.17%. False positives are 17.58%, 0.07%, 0.07%, and 0.22%. Accuracy is 82.20%, 98.40%, 99.45%, and 99.38%. That table compares separate evaluations. It is not a test of SafeLine chained behind CloudFlare or any other CDN, and it does not supply placement steps.&lt;/p&gt;
&lt;p&gt;The same page says SafeLine is production-ready. Read that as a statement about the documented proxy deployment, not as approval for an undescribed CDN hop. If the documented path is enough, resolve the name to SafeLine and point upstream at the application. If a CDN must remain the public edge, keep the plan limited to what you can verify and leave certificate mapping, cache exceptions, and original visitor identity unmarked until a source actually specifies them.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-document-putting-sites-behind-cloudflare-&quot;&gt;Does SafeLine document putting sites behind Cloudflare?&lt;/h4&gt;
&lt;p&gt;No. The home, deploy, and application pages describe a self-hosted reverse-proxy WAF and tell you to resolve the application domain to the SafeLine server. They do not document a Cloudflare or generic CDN integration.&lt;/p&gt;
&lt;h4 id=&quot;what-should-resolve-to-the-safeline-address-&quot;&gt;What should resolve to the SafeLine address?&lt;/h4&gt;
&lt;p&gt;The application guide says to resolve the domain you configured to the IP of the server where SafeLine runs, after you set domain, port, and upstream.&lt;/p&gt;
&lt;h4 id=&quot;can-mgt-proxy-place-the-waf-behind-a-cdn-&quot;&gt;Can MGT_PROXY place the WAF behind a CDN?&lt;/h4&gt;
&lt;p&gt;No. MGT_PROXY counts proxy layers for the management console only. The deploy guide says to use it only for that console proxy, and the default is 0.&lt;/p&gt;
&lt;h4 id=&quot;what-breaks-if-a-cdn-connects-to-safeline-&quot;&gt;What breaks if a CDN connects to SafeLine?&lt;/h4&gt;
&lt;p&gt;The docs do not define client-address restoration. IP-based rate limiting and any control tied to the address SafeLine sees may follow the intermediary address. Requests that a cache answers never reach the proxy.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-confirm-safeline-inspected-a-request-&quot;&gt;How do I confirm SafeLine inspected a request?&lt;/h4&gt;
&lt;p&gt;Use the documented SQL injection, XSS, path traversal, code injection, and XXE examples against your own domain. Look for the blocking page and a console attack detail. Absence from the console means you cannot claim the proxy inspected that request.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32620/how-to-decide-whether-a-waf-belongs-behind-cloudflare-or-any-cdn</guid>
<pubDate>Tue, 27 Oct 2026 02:45:36 +0000</pubDate>
</item>
<item>
<title>How to Judge a WAF Behind Cloudflare or Any CDN</title>
<link>https://coderlegion.com/32619/how-to-judge-a-waf-behind-cloudflare-or-any-cdn</link>
<description>&lt;p&gt;A CDN and a WAF can sit on the same request path, but only one of those roles is described in the SafeLine guides supplied for this article. SafeLine is a self-hosted web application firewall that filters and monitors HTTP traffic between an application and the Internet, and it is meant to stand in front of the application as a reverse proxy (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The application guide narrows that further: SafeLine is an nginx-based reverse proxy that receives traffic for the original site, cleans malicious traffic, and forwards the remaining traffic to the original application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Nothing on the home page, the deploy page, or the application page documents Cloudflare, a generic CDN origin mode, a trusted proxy list, or a client-IP header. If the search is how to put a WAF behind Cloudflare or any CDN, the accurate answer from these sources is a placement checklist, not a switch to enable.&lt;/p&gt;
&lt;p&gt;The documented visitor path is short. In Applications, you add an application and enter the domain, hostname, or IP; the port SafeLine will listen on, such as 80 or 443; the SSL option when the app is HTTPS; and the upstream, which the guide calls the real address of the original app. After those fields are saved, the guide tells you to resolve that domain to the IP address of the server where SafeLine is located, then access the protected application through the domain (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). That sentence is the whole DNS design the product states. A CDN owns the public name instead. Clients resolve to the CDN, and the CDN fetches an origin you chose in the CDN. Those are different resolution targets. You cannot satisfy both resolve the domain to the SafeLine server and resolve the domain to the CDN for the same name at the same time. One of them is outside the guide.&lt;/p&gt;
&lt;p&gt;That conflict is the decision, not a missing checkbox.&lt;/p&gt;
&lt;p&gt;Write the three addresses before you change records. Address one is the public name visitors type. Address two is the SafeLine listen address and port from Add Application. Address three is the upstream SafeLine will forward to. Protection only matches the guide when address one resolves to address two, and address two forwards to address three. If a CDN must be address one, then address two is no longer the documented public target. Label that design undocumented. Do not rename it to a SafeLine CDN feature.&lt;/p&gt;
&lt;p&gt;Keep the upstream pointed at the application. The upstream is not the previous origin name, and it is not the CDN. If the CDN origin is SafeLine and the SafeLine upstream is the CDN, traffic has nowhere stable to land. The guide's forwarding story is one direction: SafeLine receives, cleans, and forwards to the original app (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Draw that arrow before you draw a CDN arrow.&lt;/p&gt;
&lt;p&gt;Do not confuse the console with the site. The deploy guide tells you to open the console on the SafeLine server IP at port 9443, and MGT_PORT is the console port setting (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). On the same page, MGT_PROXY is the number of console proxy layers. It should only be used when configuring the proxy for the console. The default is 0, and no proxy is configured. It does not say it trusts a CDN, rewrites client addresses, or publishes an application. Leave it at 0 unless you are deliberately proxying the console and you understand you are changing console access, not site protection. Do not point a CDN origin at port 9443 in order to protect the website. That port is the management UI in the install flow, not the application listener you set to 80 or 443.&lt;/p&gt;
&lt;p&gt;Ask what SafeLine can see, then stop where the docs stop. Core capabilities include defenses for web attacks, proactive bot abused defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The same introduction describes blocking common web attacks such as SQL injection, XSS, code injection, OS command injection, CRLF injection, XXE, SSRF, and path traversal; throttling traffic that exceeds defined limits in order to defend against DoS attacks, bruteforce attempts, traffic surges, and other abuse; CAPTCHA challenges; an authentication challenge that asks visitors for a password; and dynamic protection that encrypts HTML and JS on each visit. IP-based rate limiting is explicit. If the CDN connects to SafeLine from the CDN address rather than from each visitor, SafeLine may see only that shared address. These guides never say SafeLine reads a forwarded client header, so you cannot claim that rate limits, access lists, or bot controls still distinguish visitors after that hop. If per-visitor control is the reason you deployed the WAF, the documented design is the direct path, where the domain resolves to SafeLine.&lt;/p&gt;
&lt;p&gt;Prove the block in the console, not on a provider status page. The application guide's own check is to request test cases for SQL injection, XSS, path traversal, code injection, and XXE against your protected domain, expect the blocking page, and then open the attack list and its detail view (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Run that check while the domain resolves to the SafeLine server. If you later place a CDN in front, repeat a normal request and one of those checks, and compare the console. A new attack detail supports the claim that SafeLine received the request. No new detail means the CDN result is not evidence of SafeLine inspection. If the CDN serves a cached response, the request may never reach SafeLine, and these guides do not list cache-bypass controls.&lt;/p&gt;
&lt;p&gt;Match the host to the deploy guide before you argue about edges. The minimums are Linux, x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, one CPU core, 1 GB of memory, 5 GB of disk, and SSSE3 on the CPU (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). An ARM server needs a Pro license; the Personal Edition is not supported on ARM. A CDN in front does not change those constraints, and the install page does not list provider-specific packages.&lt;/p&gt;
&lt;p&gt;Use the home-page comparison table only as a warning. It includes a CloudFlare column among detection figures (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A column name is not an origin tutorial, a compatibility statement, or permission to copy provider settings into SafeLine. Placement still comes from the application guide's domain, port, upstream, and DNS instructions.&lt;/p&gt;
&lt;p&gt;Order the work so rollback is obvious. Bring the direct path up first: console login, application fields, domain pointed at the SafeLine server, a normal page from the upstream, and a blocked test visible in the attack detail. Freeze that configuration. If a CDN is still required for caching or reach that SafeLine does not claim to provide, change DNS only as a separate, reversible step owned outside SafeLine. Record that the product docs do not cover the hop. Retest direct and proxied access independently. If the console stops explaining the blocks, put the domain back on the SafeLine address. Filling in guessed SSL modes, origin authentication, or real-IP headers will not make those behaviors appear in the current documents.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-document-a-cloudflare-or-generic-cdn-mode-&quot;&gt;Does SafeLine document a Cloudflare or generic CDN mode?&lt;/h4&gt;
&lt;p&gt;No. The cited guides describe a reverse proxy and tell you to resolve the application domain to the SafeLine server. They do not document a CDN front end.&lt;/p&gt;
&lt;h4 id=&quot;which-name-has-to-point-at-safeline-&quot;&gt;Which name has to point at SafeLine?&lt;/h4&gt;
&lt;p&gt;The domain, hostname, or IP you enter in Add Application. The application guide says to resolve that domain to the SafeLine server IP and then use it to reach the protected app.&lt;/p&gt;
&lt;h4 id=&quot;can-mgt-proxy-put-a-website-behind-a-cdn-&quot;&gt;Can MGT_PROXY put a website behind a CDN?&lt;/h4&gt;
&lt;p&gt;No. MGT_PROXY is the console proxy layer count. It defaults to 0 and is only for proxying the console, not for application traffic or a CDN origin.&lt;/p&gt;
&lt;h4 id=&quot;what-becomes-unproven-if-every-client-shares-one-cdn-address-&quot;&gt;What becomes unproven if every client shares one CDN address?&lt;/h4&gt;
&lt;p&gt;The docs list IP-based rate limiting and a web access control list, but they do not describe restoring a visitor address from a CDN header. Treat per-visitor controls as unproven in that layout.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-show-that-safeline-blocked-the-request-rather-than-the-cdn-&quot;&gt;How do I show that SafeLine blocked the request rather than the CDN?&lt;/h4&gt;
&lt;p&gt;Resolve your own application domain to SafeLine, use the guide's attack checks, and confirm the blocking page plus an attack detail in the console. A result that never creates that detail is not SafeLine evidence.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32619/how-to-judge-a-waf-behind-cloudflare-or-any-cdn</guid>
<pubDate>Tue, 27 Oct 2026 02:45:04 +0000</pubDate>
</item>
<item>
<title>How to Inventory Every PHP Version Before You Call the Estate Patched</title>
<link>https://coderlegion.com/32461/how-to-inventory-every-php-version-before-you-call-the-estate-patched</link>
<description>&lt;p&gt;The failure mode in this PHP advisory is not &quot;we upgraded PHP.&quot; It is &quot;we upgraded one PHP and left three others running.&quot; CVE-2026-109618 and CVE-2026-109619 are in PHP Core, so every branch on the host is its own decision.&lt;/p&gt;
&lt;p&gt;Build a table before you patch. Columns that earn their keep: site name, public host, PHP-FPM pool, binary path, version, owner, and status. Status should be one of upgraded, waiting, or cannot upgrade, with a reason in the last case. A shared server that still has an old pool for a forgotten landing page is still exposed.&lt;/p&gt;
&lt;p&gt;Do the upgrade in a quiet window. Back up site files, the database, and the pool config first. After the package change, restart PHP or PHP-FPM and prove the new version with the same binary the pool uses, not with a &lt;code&gt;php&lt;/code&gt; that happens to be first on a login shell.&lt;/p&gt;
&lt;p&gt;Then test the paths that exercise the bugs: home page, login, upload, and a normal form post. Read the PHP error log for a new exception. Walk the process list and confirm no pool is still bound to the old build.&lt;/p&gt;
&lt;p&gt;SafeLine does not replace that inventory. The 21 October rule gives you a place to watch suspicious multipart uploads while the list is incomplete. Set the action to blacklist, enable observe mode, and read hits instead of blocking the estate on hour one. The rule page is &lt;a rel=&quot;nofollow&quot; href=&quot;https://rivers.chaitin.cn/discussion/dbc7qkj1s5rlia466a30&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When the inventory shows a site that cannot move yet, keep that host's rule in observe, restrict who can reach the origin, and do not treat the WAF note as a permanent patch.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-know-which-version-a-vhost-uses-&quot;&gt;How do I know which version a vhost uses?&lt;/h4&gt;
&lt;p&gt;Read the pool config and the binary that pool executes, not the default CLI PHP.&lt;/p&gt;
&lt;h4 id=&quot;can-one-safeline-rule-cover-every-old-branch-&quot;&gt;Can one SafeLine rule cover every old branch?&lt;/h4&gt;
&lt;p&gt;It can watch the request pattern. It does not upgrade the branch.&lt;/p&gt;
&lt;h4 id=&quot;what-belongs-in-the-cannot-upgrade-note-&quot;&gt;What belongs in the &quot;cannot upgrade&quot; note?&lt;/h4&gt;
&lt;p&gt;The business reason and the compensating control, such as observe mode plus a closed origin.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32461/how-to-inventory-every-php-version-before-you-call-the-estate-patched</guid>
<pubDate>Mon, 26 Oct 2026 03:47:14 +0000</pubDate>
</item>
<item>
<title>Why Multipart Uploads Need a Separate Look After CVE-2026-109618</title>
<link>https://coderlegion.com/32460/why-multipart-uploads-need-a-separate-look-after-cve-2026-109618</link>
<description>&lt;p&gt;File upload is the practical entry for CVE-2026-109618. The weakness is in PHP's handling of &lt;code&gt;multipart/form-data&lt;/code&gt; and the memory state around that parse, not in a single shopping-cart plugin.&lt;/p&gt;
&lt;p&gt;An attacker does not need a valid image. They need a request that looks like a form upload and stresses the parser: odd boundaries, unexpected fields, or a progress token the application never meant to honor. The result called out in the advisory is service disruption or a runtime fault, which is enough to create a window for a follow-on web attack.&lt;/p&gt;
&lt;p&gt;SafeLine's 21 October rule looks for that shape on the wire. The signals called out in the rule note are a &lt;code&gt;PHP_SESSION_UPLOAD_PROGRESS&lt;/code&gt; parameter, a &lt;code&gt;PHPSESSID&lt;/code&gt; that matches the known pattern, a &lt;code&gt;multipart/form-data&lt;/code&gt; content type, and a body that pairs abnormal fields with suspicious content. Details are in the &lt;a rel=&quot;nofollow&quot; href=&quot;https://rivers.chaitin.cn/discussion/dbc7qkj1s5rlia466a30&quot;&gt;rule discussion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Turn the rule action to blacklist and leave observe mode on. Observe mode writes the event and keeps the source and request. It does not drop the request. That matters on checkout, profile photo, and ticket-attachment routes, where a hard block on day one will page the wrong team.&lt;/p&gt;
&lt;p&gt;While the rule watches, do the origin work. Back up files, the database, and the PHP pool config. Upgrade the PHP branch that pool actually uses. Restart PHP-FPM. Then click through home, login, upload, and form submit. Read the PHP error log for a new fault, and confirm no second vhost is still pinned to the old binary.&lt;/p&gt;
&lt;p&gt;If the same address keeps changing the body of upload posts, treat that as probing even when the rule is still in observe. Only after that picture is stable should you switch the rule from record-only to block.&lt;/p&gt;
&lt;h4 id=&quot;is-every-upload-form-affected-&quot;&gt;Is every upload form affected?&lt;/h4&gt;
&lt;p&gt;Any PHP path that accepts multipart bodies is in scope until that site's runtime is confirmed current.&lt;/p&gt;
&lt;h4 id=&quot;will-observe-mode-stop-the-exploit-&quot;&gt;Will observe mode stop the exploit?&lt;/h4&gt;
&lt;p&gt;No. It records. Blocking is a later, separate change.&lt;/p&gt;
&lt;h4 id=&quot;what-should-be-upgraded-first-&quot;&gt;What should be upgraded first?&lt;/h4&gt;
&lt;p&gt;The PHP version serving the upload vhost, not the CMS theme.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32460/why-multipart-uploads-need-a-separate-look-after-cve-2026-109618</guid>
<pubDate>Mon, 26 Oct 2026 03:44:13 +0000</pubDate>
</item>
<item>
<title>How to Judge an IP Whitelist Request in SafeLine</title>
<link>https://coderlegion.com/32452/how-to-judge-an-ip-whitelist-request-in-safeline</link>
<description>&lt;p&gt;When someone asks how to whitelist an IP in SafeLine, separate the policy question from the missing procedure. The introduction describes SafeLine as a self-hosted web application firewall that filters and monitors HTTP traffic between an application and the Internet. It sits as a reverse proxy, so clients pass through it before they reach the server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). That page lists web-attack defenses, proactive bot defense, HTML and JS code encryption, IP-based rate limiting, and a Web Access Control List. None of the supplied pages shows a whitelist screen, an allow-IP field, or a command that exempts a source address. The sound response is a decision checklist, not an invented click path.&lt;/p&gt;
&lt;p&gt;SafeLine receives traffic for the original site, cleans malicious requests, and forwards the remaining traffic upstream. The application guide describes it as an HTTP and HTTPS reverse proxy developed based on nginx (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). A familiar address does not prove that every request from it is safe. An office network, vendor, monitor, or build system can still send a bad query string, a broken header, or a sudden burst. An IP exception would weaken the cleaning step if a product documented one. These pages do not document it, so the practical work is to explain the failure with controls that are actually described.&lt;/p&gt;
&lt;p&gt;Confirm that the client is reaching SafeLine before you discuss exceptions. In the web admin console, protection starts on the Applications page. Add the application with its domain, listen port, and upstream address. For HTTPS, check the SSL option. Resolve that domain to the server running SafeLine, then reach the site through the protected name (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). If DNS still points at the origin, SafeLine never sees the client, and no access change on the firewall can explain the ticket. If a deliberate test produced the blocking page, that page means the attack was defended. Open the attack list and its detail view before anyone proposes an exception.&lt;/p&gt;
&lt;p&gt;Record evidence before changing policy. Note the source IP, time, host header, method, path, and what the caller saw: a block page, a challenge, throttling, or a connection failure. Map that note only to behaviors in the supplied documents.&lt;/p&gt;
&lt;p&gt;Attack filtering is the first map. Documented defenses include SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor traffic, brute force, HTTP flood, and bot abuse (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A partner tool can trip those checks with a test parameter even when the owner is not hostile. Review the request content. Do not convert one bad payload into a permanent pass for the whole address.&lt;/p&gt;
&lt;p&gt;Volume is the second map. IP-based rate limiting is a named core capability, and the rate limiting feature throttles traffic that exceeds defined limits. Its stated purpose is defense against denial-of-service attempts, brute-force attempts, traffic surges, and other abuse (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). If the caller is a monitor or a batch job, compare its rate with the limit you defined. Reviewing a limit is not the same as allowing every later request from that IP. These pages never say a source address can be removed from rate limiting or from attack detection.&lt;/p&gt;
&lt;p&gt;Visitor checks are the third map, and only when they are in use. Captcha challenge is documented so human users can continue while crawlers and bots are blocked. When authentication challenge is turned on, visitors must enter the password or they are blocked. When dynamic protection is turned on, HTML and JS from the web server are dynamically encrypted on each visit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A non-browser client can fail a challenge without being an attacker. Decide whether that application should keep the challenge enabled. Do not assume the source IP can be carved out of it.&lt;/p&gt;
&lt;p&gt;Treat the Web Access Control List as a named capability, not as a finished allowlist design. The introduction lists it, but the supplied pages do not define match fields, actions, or IP semantics (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). If the console you are using shows an access-control form, follow only the labels on that screen and record the exact change plus a rollback. If it does not offer a source-IP allow action, stop. Do not copy a rule from another product, and do not guess command flags. An unsupported integration is outside this guide.&lt;/p&gt;
&lt;p&gt;Keep install facts out of the access decision. SafeLine expects Linux on x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, and at least 1 CPU core, 1 GB of memory, and 5 GB of disk. The deploy guide opens the console on the SafeLine host at port 9443, and docker exec safeline-mgt resetadmin prints the initial administrator username and password (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). An ARM install requires a Pro license, and the Personal Edition is not supported on ARM. Those constraints tell you whether the instance can run. They do not create an IP allowlist.&lt;/p&gt;
&lt;p&gt;Close the review with one written outcome. Leave inspection unchanged, tune only a documented limit or challenge for that application, or escalate because the requested whitelist is not described. After any change, confirm again that the domain resolves to the SafeLine server and that ordinary requests still reach the upstream (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Store the rollback note with the ticket. Leaving the IP inspected is a valid result when the only proposal is an undocumented pass.&lt;/p&gt;
&lt;h4 id=&quot;does-this-documentation-set-show-how-to-whitelist-an-ip-&quot;&gt;Does this documentation set show how to whitelist an IP?&lt;/h4&gt;
&lt;p&gt;No. It names a Web Access Control List and IP-based rate limiting, and it explains reverse-proxy protection, but it does not give whitelist steps, fields, or commands (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Until a page you are using documents the control, do not publish a procedure for it.&lt;/p&gt;
&lt;h4 id=&quot;what-should-i-verify-before-i-touch-any-access-setting-&quot;&gt;What should I verify before I touch any access setting?&lt;/h4&gt;
&lt;p&gt;Verify the application domain, port, SSL choice, and upstream, and verify that DNS points at the SafeLine server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Then match the symptom to attack blocking, rate limiting, captcha, authentication challenge, or dynamic protection. Those are the behaviors the introduction describes (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&quot;can-i-treat-a-known-ip-as-safe-because-rate-limiting-is-ip-based-&quot;&gt;Can I treat a known IP as safe because rate limiting is IP-based?&lt;/h4&gt;
&lt;p&gt;No. IP-based rate limiting is described as throttling traffic that exceeds defined limits, not as an identity allowlist (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A known network can still send injection payloads, floods, or automated calls. These pages do not say attack inspection can be skipped for a trusted address.&lt;/p&gt;
&lt;h4 id=&quot;how-do-challenges-differ-from-an-ip-exception-&quot;&gt;How do challenges differ from an IP exception?&lt;/h4&gt;
&lt;p&gt;Captcha, authentication challenge, and dynamic protection are visitor or content controls, and the last two apply when turned on (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). They are not documented as per-IP whitelist switches. If a client fails a challenge, review whether that application should use the challenge. Do not invent a source-address carve-out.&lt;/p&gt;
&lt;h4 id=&quot;when-is-the-right-outcome-to-leave-the-ip-inspected-&quot;&gt;When is the right outcome to leave the IP inspected?&lt;/h4&gt;
&lt;p&gt;Leave it inspected when the request contains an attack payload, when the client can still reach the origin directly, or when the only proposal is a permanent pass for every path and method. Also leave it inspected when you cannot cite a control from the introduction, the deploy guide (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;), or the application guide. Missing steps are a reason to stop, not a reason to improvise.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32452/how-to-judge-an-ip-whitelist-request-in-safeline</guid>
<pubDate>Mon, 26 Oct 2026 02:24:41 +0000</pubDate>
</item>
<item>
<title>How to Check an IP Allow Request Before Changing SafeLine Controls</title>
<link>https://coderlegion.com/32451/how-to-check-an-ip-allow-request-before-changing-safeline-controls</link>
<description>&lt;p&gt;People who search for how to whitelist an IP in SafeLine WAF usually expect a short console path. The pages used for this article do not document that path. They do not list an allow field, a match expression, or a command that exempts one address from inspection. They do document enough to make a careful decision. SafeLine is a self-hosted web application firewall. It works as a reverse proxy. Its core capabilities include attack defense, proactive bot defense, HTML and JavaScript encryption, IP-based rate limiting, and a Web Access Control List (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Until a cited page shows an IP allow action, the sound response is a checklist, not a guessed bypass.&lt;/p&gt;
&lt;p&gt;SafeLine filters and monitors HTTP traffic between a web application and the Internet. Placed in front of an app, it receives client traffic first, blocks what its policies treat as malicious, and forwards traffic it treats as safe to the origin (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). That is the opposite of a client-side proxy that hides who is browsing. An address someone hopes to trust still speaks HTTP or HTTPS. Calling it trusted does not move it behind the origin, and it does not make the request harmless. Any exception is a choice to weaken a control on the only hop these pages describe.&lt;/p&gt;
&lt;p&gt;Write the request in one sentence before anyone edits policy. Ask whether the caller wants a false-positive review, a higher rate-limit ceiling, or a full inspection skip. Those are different controls. The home page lists defenses for SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abuse, among others. Rate limiting throttles traffic that exceeds defined limits and is described as a defense against denial-of-service attempts, brute force, traffic surges, and other abuse. A CAPTCHA challenge is aimed at bot attacks, while human visitors are allowed through. When authentication challenge is turned on, visitors must enter the password or they are blocked. When dynamic protection is turned on, HTML and JavaScript are encrypted on each visit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). An address that tripped one control is not automatically a candidate to skip the others. IP-based rate limiting is named beside Web Access Control List. These pages never say that either item is an IP whitelist, and they never show how to edit either one.&lt;/p&gt;
&lt;p&gt;Confirm that the application is actually on SafeLine. In the Web Admin Console, an application is added with a domain, hostname, or IP, a listen port such as 80 or 443, and an upstream address. HTTPS apps use the SSL option. The domain must then resolve to the server where SafeLine runs, and clients should reach the site through that name (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). If DNS still points at the origin, a policy note on the WAF changes nothing for that client, and the origin stays directly reachable. The deploy guide shows the console on the management port after installation, with 9443 as the documented example (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). That is where applications and the attack list are reviewed. In these documents, it is not a whitelist screen.&lt;/p&gt;
&lt;p&gt;Read the event that prompted the request. The application guide says a blocked attack shows a blocking page, and that operators check the attack list and open detail for the specific hit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Compare that detail with the payload the caller claims to have sent. The same page gives sample probes for SQL injection, XSS, path traversal, code injection, and XXE, and says those should be blocked on a protected site. If the complained-about URL looks like one of those samples, allowing the source would hide an attack. A normal page load only shows that SafeLine forwarded something it considered safe. It does not prove that inspection is still active for everyone else.&lt;/p&gt;
&lt;p&gt;Use this gate, and keep the notes with the change request:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Record one source address and show that it is stable. An office NAT, a cloud egress, or a scanner pool is shared by many clients.&lt;/li&gt;
&lt;li&gt;Record the application domain, listen port, SSL choice, and upstream so the note cannot be applied to the wrong site.&lt;/li&gt;
&lt;li&gt;Attach the attack-list detail, not a generic timeout or a browser error page.&lt;/li&gt;
&lt;li&gt;Name the control in the way: attack defense, rate limiting, CAPTCHA, authentication challenge, or dynamic protection.&lt;/li&gt;
&lt;li&gt;Name an owner and an expiry. A permanent skip is a standing hole.&lt;/li&gt;
&lt;li&gt;Plan the revoke step and a retest from an address that must remain inspected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any line is missing, do not change policy. Ask the caller to use the protected domain, reproduce the request once, and send the detail view. That is slower than typing an address into an imagined allow box, and it is the only workflow these sources support. Do not treat a rate-limit complaint as permission to disable attack defense, and do not treat a shared egress address as a single trusted user.&lt;/p&gt;
&lt;p&gt;After any access-control edit made outside these pages, prove the site still fails closed. From a source that should not be exempt, request one documented sample, such as the SQL injection or path traversal probe, against your own protected domain. You should see the blocking page, and a new row should appear in the attack list with detail (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). If that check fails, revert before looking for a narrower exception. Then load an ordinary page and confirm the upstream still answers. Keep the exception note short enough that another operator can remove it without guessing why it was added.&lt;/p&gt;
&lt;p&gt;The home page also points operators to community discussion, including a Discord FAQ channel, plus GitHub issues (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A chat reply is not a configuration reference. If a later document describes an IP allow action, follow that page rather than this checklist. Until then, identify the hop, read the detail, map the complaint to one named control, and refuse a blind whitelist.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-document-an-ip-whitelist-button-&quot;&gt;Does SafeLine document an IP whitelist button?&lt;/h4&gt;
&lt;p&gt;No. The home page, the deploy guide, and the application guide do not show a whitelist field, command, or match rule. They name Web Access Control List and IP-based rate limiting without editing steps (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&quot;is-web-access-control-list-the-same-as-an-ip-allowlist-&quot;&gt;Is Web Access Control List the same as an IP allowlist?&lt;/h4&gt;
&lt;p&gt;Not from these pages. It is listed as a core capability next to attack defense, proactive bot defense, HTML and JavaScript encryption, and IP-based rate limiting. No allow action, scope, or address format is specified.&lt;/p&gt;
&lt;h4 id=&quot;should-a-scanner-or-office-nat-address-skip-inspection-&quot;&gt;Should a scanner or office NAT address skip inspection?&lt;/h4&gt;
&lt;p&gt;Not by default. One address can represent many users, and the documented attack samples are blocked on purpose. Consider a narrow, time-limited review only after one stable source matches one false positive in the detail view.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-confirm-traffic-passes-through-safeline-&quot;&gt;How do I confirm traffic passes through SafeLine?&lt;/h4&gt;
&lt;p&gt;Review the application entry: domain, listen port, SSL if required, and upstream. Resolve that domain to the SafeLine server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). If the origin address is still published directly, the WAF is not on the client path.&lt;/p&gt;
&lt;h4 id=&quot;what-should-i-retest-after-an-access-control-change-&quot;&gt;What should I retest after an access-control change?&lt;/h4&gt;
&lt;p&gt;From a source that must stay inspected, send a documented probe such as a SQL injection or path traversal sample to your protected domain. Expect the blocking page and a new attack-list detail. Then request a normal page so you know safe traffic still reaches the upstream.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32451/how-to-check-an-ip-allow-request-before-changing-safeline-controls</guid>
<pubDate>Mon, 26 Oct 2026 02:24:10 +0000</pubDate>
</item>
<item>
<title>How to Configure Rate Limiting with a WAF Without Guessing the Ceiling</title>
<link>https://coderlegion.com/32450/how-to-configure-rate-limiting-with-a-waf-without-guessing-the-ceiling</link>
<description>&lt;p&gt;Configuring rate limiting is a policy decision that happens to be enforced by a proxy. If you start from a round number, you will either block a shared office network or leave a login form open to guessing. SafeLine's own pages are unusually clear about the boundary: they name the control, and they do not hand you a sample rule.&lt;/p&gt;
&lt;p&gt;The product overview lists IP-based rate limiting among the core capabilities, next to web-attack defenses, bot defense, HTML and JavaScript encryption, and a web access control list (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The feature note says rate limiting defends web apps against DoS attacks, bruteforce attempts, traffic surges, and other abuse by throttling traffic that exceeds defined limits. Read that as a contract. You define the limits. The WAF throttles what exceeds them. The overview, the install guide, and the application guide do not publish default thresholds, rule-field names, or a shell command that creates a limit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). This checklist is how to configure the control without pretending those missing details exist.&lt;/p&gt;
&lt;h3 id=&quot;confirm-the-reverse-proxy-before-you-throttle-anyone&quot;&gt;Confirm the reverse proxy before you throttle anyone&lt;/h3&gt;
&lt;p&gt;A rate limit can only count requests that reach the WAF. SafeLine is a self-hosted web application firewall. It filters and monitors HTTP traffic between a web application and the Internet, and it sits as a reverse proxy so clients pass through it before they reach the server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The application guide describes the same design in implementation terms: SafeLine is developed based on nginx, receives traffic for the original site, removes malicious traffic, and forwards the remaining traffic to the upstream application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The documented setup is in the Web Admin Console, not in a rate-limit API. On the Applications page, use Add Application. Enter the original domain, hostname, or IP. Set the port SafeLine will listen on, such as 80 or 443, and check SSL for HTTPS apps. Set the upstream to the real address that should receive cleaned traffic. After that, resolve the domain to the SafeLine server. Until DNS points there, clients can still bypass the proxy, and any later limit is optional for attackers who know the origin.&lt;/p&gt;
&lt;p&gt;Prove the path with two checks that the docs actually support. First, load the site through the proxied domain and confirm the upstream responds. Second, try a harmless attack-shaped request of the kind the application guide lists, such as a SQL injection style query, an XSS-style query, a path traversal query, a code injection query, or an XXE-style query, with your own domain in place of the example host. A blocking page means the proxy inspected the request. The console attack list, opened from detail, is where you confirm the event. Neither check proves a rate limit is on. They only prove you are about to configure throttling on the path users actually use.&lt;/p&gt;
&lt;p&gt;The install guide is the other half of whether you can even reach the console. It expects Linux, Docker, and Docker Compose, and it opens the console at &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt; after startup (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). That page is about bringing the instance up. It is not a rate-limit reference, so do not search it for a hidden throttle flag.&lt;/p&gt;
&lt;h3 id=&quot;treat-the-documented-identity-as-the-whole-identity&quot;&gt;Treat the documented identity as the whole identity&lt;/h3&gt;
&lt;p&gt;The capability is IP-based. Configuration starts by accepting that limit, not by wishing for a user-based quota the supplied pages never describe. An address limit groups every request that arrives from the same IP. It will merge coworkers behind one office firewall. It will split an attacker who rotates addresses. If your abuse problem is one account across many IPs, or one IP across many accounts, IP throttling is only a partial answer. Say that in the change ticket so nobody later treats a quiet chart as proof that credential stuffing stopped.&lt;/p&gt;
&lt;p&gt;Write the policy in plain language before you touch a number. Decide which path is expensive enough to protect first. Login, password reset, and any route that sends mail or SMS usually come before the homepage. Decide which shared addresses must survive a normal morning. A support team, a campus NAT, or a partner integration can look like a surge. Then name the failure mode you are buying down. Bruteforce wants a low ceiling on a small form. A traffic surge on a content page wants a higher ceiling. A DoS flood wants the origin kept alive even if some clients wait. The overview names all three. One number rarely serves all three equally well.&lt;/p&gt;
&lt;p&gt;SafeLine also documents payload defenses for SQL injection, XSS, code injection, OS command injection, CRLF injection, XXE, SSRF, path traversal, and related attacks (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Keep those rules in the design, but do not count them as rate limiting. A patient scanner can stay under a loose IP ceiling and still send exploit strings. A legitimate monitoring job can send clean requests fast enough to hurt a small upstream. Volume and malice are different axes.&lt;/p&gt;
&lt;h3 id=&quot;choose-the-number-from-your-origin-then-watch-the-first-peak&quot;&gt;Choose the number from your origin, then watch the first peak&lt;/h3&gt;
&lt;p&gt;Because the docs say the product throttles traffic that exceeds defined limits, the missing input is the definition. Take it from the origin's capacity, measured by you, not from a blog example.&lt;/p&gt;
&lt;p&gt;Time the sensitive path under a normal peak. Note the request rate at which latency or errors become unacceptable. Then note the busiest legitimate IP in that same window, especially if it is a shared network. The ceiling should sit above that legitimate burst and below the rate at which one address can consume the origin by itself. If you cannot measure either number, you are not ready to turn the control on. Waiting is better than publishing a guess that blocks customers.&lt;/p&gt;
&lt;p&gt;If the console you are running lets you attach a limit to one application or one path, start with the weakest critical route and leave everything else alone. If it exposes only a broader IP limit, document that constraint and pick the number required by the weakest critical route. Do not assume per-user keys, geographic buckets, or header-based quotas. Those shapes are not in the supplied sources.&lt;/p&gt;
&lt;p&gt;Change a single limit, record the old value, and compare throttle events with access logs through the next real peak. Success is specific: guessing and floods slow down, and the shared NAT you wrote down still completes login. If good traffic is throttled, raise the limit or narrow the scope you can actually configure. If a single client can still stall the origin, the limit is too high or it is not on the path you tested.&lt;/p&gt;
&lt;h3 id=&quot;pair-volume-controls-with-the-other-documented-challenges&quot;&gt;Pair volume controls with the other documented challenges&lt;/h3&gt;
&lt;p&gt;Rate limiting is the volume tool. The same overview documents neighboring tools that answer other questions, and mixing them up is how configurations get noisy.&lt;/p&gt;
&lt;p&gt;Captcha challenge is described as a bot control: human users are allowed, crawlers and bots are blocked. Authentication challenge asks visitors for a password or blocks them. Dynamic protection encrypts HTML and JavaScript on each visit. Those are useful beside an IP limit when the problem is automation or casual replay, not raw request rate. They are not hidden rate-limit modes, and the pages do not say they share counters with IP throttling.&lt;/p&gt;
&lt;p&gt;A sensible order is proxy, attack-inspection check, then rate limit, then an optional challenge on the route that attracts bots. Roll back the last change if the next peak looks wrong. Also close the bypass on the origin itself by allowing only the WAF host to connect. That origin restriction is your firewall or security group, not a SafeLine feature listed in these guides. Without it, the documented reverse-proxy model is advice rather than the only door.&lt;/p&gt;
&lt;p&gt;Review the policy when the application changes. A new login endpoint, a marketing spike, or a partner that crawls from one address can invalidate yesterday's ceiling. The WAF will keep enforcing the old definition until you change it.&lt;/p&gt;
&lt;h4 id=&quot;what-does-safeline-document-about-configuring-rate-limiting-&quot;&gt;What does SafeLine document about configuring rate limiting?&lt;/h4&gt;
&lt;p&gt;It documents IP-based rate limiting that throttles traffic above limits you define, aimed at DoS attacks, bruteforce attempts, traffic surges, and other abuse (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The supplied install and application pages do not list rate-limit fields, defaults, or commands. Configure only the limit control you can see in your console, after the app is proxied.&lt;/p&gt;
&lt;h4 id=&quot;does-a-block-page-mean-my-rate-limit-works-&quot;&gt;Does a block page mean my rate limit works?&lt;/h4&gt;
&lt;p&gt;No. The application guide's block page and attack-list detail show that SafeLine inspected a malicious-looking request and blocked it (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). That verifies the reverse proxy. A rate limit still needs its own test: traffic from one IP above the limit you defined should be throttled, and traffic below it should pass.&lt;/p&gt;
&lt;h4 id=&quot;can-i-copy-a-threshold-from-somewhere-else-&quot;&gt;Can I copy a threshold from somewhere else?&lt;/h4&gt;
&lt;p&gt;You should not. Nothing in the supplied official pages gives a recommended request rate. A limit that fits a static blog can lock out a shared office on a login form. Measure the origin and the busiest legitimate IP, then set the ceiling between those two facts.&lt;/p&gt;
&lt;h4 id=&quot;how-is-rate-limiting-different-from-captcha-or-an-auth-challenge-&quot;&gt;How is rate limiting different from captcha or an auth challenge?&lt;/h4&gt;
&lt;p&gt;Rate limiting throttles volume that exceeds a defined limit. Captcha challenge is documented as a human-versus-bot check. Authentication challenge requires a password. Dynamic protection encrypts page code per visit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Use the one that matches the failure you are seeing, and do not expect one of them to enforce another's job.&lt;/p&gt;
&lt;h4 id=&quot;what-if-legitimate-users-share-a-single-public-ip-&quot;&gt;What if legitimate users share a single public IP?&lt;/h4&gt;
&lt;p&gt;That is the main design limit of an IP-based control. Count that address as one client, measure its real peak, and set the ceiling above that peak. If the abuse you care about is automated rather than merely fast, consider the documented captcha or authentication challenge as a separate control instead of crushing the shared address.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32450/how-to-configure-rate-limiting-with-a-waf-without-guessing-the-ceiling</guid>
<pubDate>Mon, 26 Oct 2026 02:23:01 +0000</pubDate>
</item>
<item>
<title>How to Configure Rate Limiting with a WAF: A Checklist Before You Enforce Limits</title>
<link>https://coderlegion.com/32449/how-to-configure-rate-limiting-with-a-waf-a-checklist-before-you-enforce-limits</link>
<description>&lt;p&gt;Rate limiting looks like a settings page problem, but the useful work happens before any limit is enforced. A web application firewall sits in front of the origin and decides which HTTP traffic is allowed to continue. SafeLine describes that role as a reverse proxy: clients reach the WAF first, and only traffic that passes policy is forwarded to the application. IP-based rate limiting is one of its documented core capabilities, alongside attack defenses, proactive bot-abuse defense, HTML and JavaScript code encryption, and a web access control list (SafeLine introduction, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The product page states the purpose of rate limiting directly: defend web apps against DoS attacks, brute-force attempts, traffic surges, and other abuse by throttling traffic that exceeds defined limits (SafeLine features, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). That sentence is the whole public contract. It does not publish field names, default counters, window sizes, or a recommended number of requests per IP. If you are looking for a click-by-click recipe, the supplied configuration guide does not provide one. It documents how to place an application behind the proxy, not how to tune a throttle. The practical response is a checklist: decide what you are protecting, define the unit of traffic, separate throttling from other controls, put the proxy in the path, then measure before you block.&lt;/p&gt;
&lt;p&gt;Start with the asset, not the slider. A login form, a search endpoint, a file download, and a public homepage do not share a sensible limit. Brute-force risk is concentrated on authentication and password-reset paths. A traffic surge may be a marketing campaign hitting the homepage. A DoS pattern may be many requests from one address, or many addresses sharing one expensive route. Write down the route, the method, and the business action before you write down a number.&lt;/p&gt;
&lt;p&gt;Next, define the identity you can actually count. SafeLine documents IP-based rate limiting, so the documented unit is the client IP as seen by the WAF (SafeLine introduction, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). That is useful and also incomplete as a security model. Offices, mobile carriers, and privacy relays can put many people behind one address. A single attacker can also rotate addresses. Your checklist should record whether the site has shared egress, whether you terminate TLS at SafeLine, and whether another proxy already sits in front. If another proxy is present, the address SafeLine sees may be the proxy, not the visitor. Do not assume a header rewrites that view unless you have verified it in your own deployment. The public docs supplied here do not describe header trust or rate-limit exceptions.&lt;/p&gt;
&lt;p&gt;Separate four controls that are easy to blur together. Attack blocking is for malicious request content such as SQL injection, XSS, code injection, OS command injection, CRLF injection, XXE, SSRF, and path traversal (SafeLine features, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Rate limiting is for volume that exceeds a defined limit, including DoS, brute force, surges, and other abuse. A CAPTCHA challenge is documented as a way to allow human visitors while blocking crawlers and bots. An authentication challenge, when turned on, requires a visitor to enter a password or be blocked. Dynamic protection encrypts HTML and JavaScript on each visit. None of those descriptions says that one feature replaces the others. A signature can stop a malicious payload that arrives slowly. A throttle can stop a flood of otherwise ordinary requests. A challenge can slow automated clients that still stay under a crude IP cap.&lt;/p&gt;
&lt;p&gt;Place the WAF before you judge any limit. SafeLine is described as an nginx-based HTTP and HTTPS reverse proxy that receives traffic for the original site, removes malicious attack traffic, and forwards the remaining traffic upstream (Add an application, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). The documented application fields are Domain, Port, and Upstream. Port examples are 80 and 443, with SSL checked for HTTPS apps. After those settings, the domain must resolve to the SafeLine server. Until that path is real, a rate limit cannot see the traffic you intend to protect, and any number you choose is fiction.&lt;/p&gt;
&lt;p&gt;Only then collect a baseline. For at least one normal business day, and ideally across a peak, record requests per minute for the whole site and for the sensitive routes, unique source IPs, error rates, and the slowest upstream endpoints. Note scheduled jobs, health checks, and partner integrations that look like bursts. Pick a limit above the legitimate peak with explicit headroom, then decide the action: throttle, temporary block, or a challenge if that control is already part of your policy. Roll the change out on one application, watch both blocked events and real user complaints, and keep a written rollback. The docs show that attack events can be reviewed in the web console, including an attack list and a detail view (Add an application, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Use that habit for volume events too: if you cannot explain who was limited and why, the limit is not configured, it is only enabled.&lt;/p&gt;
&lt;p&gt;A sound configuration is therefore a short written policy: protected routes, IP as the documented counting key, a measured ceiling, an enforcement action, an exception process for shared networks, and an owner who reviews false blocks. The WAF can throttle traffic that exceeds defined limits. You still have to define them from your own traffic, because the official pages do not supply those numbers for you.&lt;/p&gt;
&lt;h4 id=&quot;what-does-safeline-document-about-rate-limiting-&quot;&gt;What does SafeLine document about rate limiting?&lt;/h4&gt;
&lt;p&gt;It documents IP-based rate limiting and says the feature throttles traffic that exceeds defined limits in order to defend against DoS attacks, brute-force attempts, traffic surges, and other abuse (SafeLine features, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). It does not, in the pages used here, publish the console fields, default thresholds, or a sample policy.&lt;/p&gt;
&lt;h4 id=&quot;does-rate-limiting-replace-attack-detection-&quot;&gt;Does rate limiting replace attack detection?&lt;/h4&gt;
&lt;p&gt;No. Attack defenses target malicious request classes such as injection, XSS, SSRF, and path traversal. Rate limiting targets excess volume. A rare malicious request can be dangerous without looking like a flood, and a flood can be made of requests that are individually ordinary.&lt;/p&gt;
&lt;h4 id=&quot;where-does-rate-limiting-fit-in-the-request-path-&quot;&gt;Where does rate limiting fit in the request path?&lt;/h4&gt;
&lt;p&gt;SafeLine must be in front of the origin as a reverse proxy. The documented setup is an application with a domain, a listening port, an upstream address, and DNS pointed at the SafeLine server (Add an application, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Limits apply to traffic that actually arrives there.&lt;/p&gt;
&lt;h4 id=&quot;why-is-an-ip-limit-risky-for-legitimate-users-&quot;&gt;Why is an IP limit risky for legitimate users?&lt;/h4&gt;
&lt;p&gt;Many users can share one public address, so a strict per-IP ceiling can throttle an office or a mobile network during a normal peak. Record shared-egress cases before enforcement, and review blocks against a measured baseline rather than a guessed round number.&lt;/p&gt;
&lt;h4 id=&quot;what-should-i-check-after-enabling-a-limit-&quot;&gt;What should I check after enabling a limit?&lt;/h4&gt;
&lt;p&gt;Confirm the domain still reaches the origin through SafeLine, compare blocked volume with the baseline, inspect console details for surprising sources, and keep a rollback if a partner, monitor, or campaign was not in the checklist. Do not treat a quiet console as proof that the limit is correct; it may only mean the threshold is too high to observe.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32449/how-to-configure-rate-limiting-with-a-waf-a-checklist-before-you-enforce-limits</guid>
<pubDate>Mon, 26 Oct 2026 02:22:29 +0000</pubDate>
</item>
<item>
<title>Why I Test the Proxy Path Before I Trust a WAF Block</title>
<link>https://coderlegion.com/32356/why-i-test-the-proxy-path-before-i-trust-a-waf-block</link>
<description>&lt;p&gt;Installing a console and proving that visitor traffic is inspected are different tests. SafeLine can filter a request only after that request enters its reverse proxy. If the public name still points at the origin, or if you call the upstream address directly, a malicious query can succeed while the attack list stays empty. When I need to know how to test if your WAF is working, I ask three questions in order: did this request reach SafeLine, did a documented malicious query get blocked, and does the console detail belong to that same attempt?&lt;/p&gt;
&lt;p&gt;SafeLine is a self-hosted web application firewall. The product introduction says it protects web apps by filtering and monitoring HTTP traffic, including SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abuse. It works as a reverse proxy: clients pass through it before they reach the server, malicious HTTP traffic is blocked, and unauthorized data is prevented from leaving the app. The application guide adds the operational detail: SafeLine is developed on nginx, receives traffic for the original website, cleans malicious attack traffic, and forwards safe traffic to the original application. Those statements are in &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;prove-the-proxy-path-first&quot;&gt;Prove the proxy path first&lt;/h3&gt;
&lt;p&gt;I do not start with an exploit string. I log in to the Web Admin Console, open Applications, and check the application record. Domain is the name, hostname, or address clients use. Port is the port SafeLine listens on, such as 80 or 443, and an HTTPS app needs the SSL option checked. Upstream is the real address of the original app. After those fields are saved, the domain has to resolve to the IP of the server where SafeLine runs. Until that is true, a browser request is not a test of this WAF.&lt;/p&gt;
&lt;p&gt;A negative check matters too. If I request the upstream address and skip the published domain, I am not exercising SafeLine. A normal page from the origin only shows that the origin is up. It says nothing about detection. The home page also includes an effect evaluation on a fixed sample set. I do not treat that table as proof that my own site is protected. A live test still has to travel through my domain, my port, and my upstream.&lt;/p&gt;
&lt;h3 id=&quot;use-the-cases-the-guide-already-published&quot;&gt;Use the cases the guide already published&lt;/h3&gt;
&lt;p&gt;The application guide includes a short set of cases for this check. Replace the example host with the protected domain. SQL injection is &lt;code&gt;/?id=1+and+1=2+union+select+1&lt;/code&gt;. XSS is &lt;code&gt;/?id=&amp;lt;img+src=x+onerror=alert()&amp;gt;&lt;/code&gt;. Path traversal is &lt;code&gt;/?id=../../../../etc/passwd&lt;/code&gt;. Code injection is &lt;code&gt;/?id=phpinfo();system('id')&lt;/code&gt;. XXE places &lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&amp;lt;!DOCTYPE foo SYSTEM &quot;&quot;&amp;gt;&lt;/code&gt; in the id query value. Request those URLs on the domain and port configured for the application. Do not send them to the upstream IP.&lt;/p&gt;
&lt;p&gt;The guide says that if you see the blocking page, SafeLine defended the attack. That page is the first signal. It is not the whole proof. Open the web console, find the attack list, and click detail. I treat the test as passed only when the blocking page and that detail both line up with the probe I just sent. A block page without a matching console event can come from another device, a cached response, or a different hostname. A console row without a block on the public URL can mean I tested a name visitors do not use.&lt;/p&gt;
&lt;h3 id=&quot;do-not-stretch-one-sample-into-full-coverage&quot;&gt;Do not stretch one sample into full coverage&lt;/h3&gt;
&lt;p&gt;Those five cases are enough to show that common web-attack filtering is active on that path. They do not exercise every capability listed in the introduction. Rate limiting is described as throttling traffic that exceeds defined limits, including DoS attacks, brute-force attempts, and traffic surges. CAPTCHA challenge is described as a way to allow human users while blocking crawlers and bots. Authentication challenge, when turned on, requires a password or the visitor is blocked. Dynamic protection, when turned on, dynamically encrypts HTML and JS on each visit. None of the published one-line probes is a test of those controls. If the site depends on one of them, I record that the web-attack check did not cover it, instead of assuming that control is active.&lt;/p&gt;
&lt;p&gt;The management console is a separate path as well. The deploy guide shows how to open &lt;code&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/code&gt; and how to recover the initial administrator account with &lt;code&gt;docker exec safeline-mgt resetadmin&lt;/code&gt;. A successful login proves that the console answered. It does not prove that traffic on the application port was inspected. Install checks, including Docker version, architecture, memory, disk, and the CPU ssse3 note, belong to setup. Protection checks belong to the application domain. The deploy steps are documented at &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I run these probes only against an application I control. They are examples from the product documentation, not a reason to scan someone else's site. After a block is confirmed, I load an ordinary page through the same domain. Safe traffic is supposed to be forwarded upstream. If that normal page fails, the problem is proxy or upstream configuration, and I do not call the security test successful. I write down the time, the exact URL, the application name, and whether detail opened. The next DNS or upstream change can then be checked the same way, instead of by memory.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-know-the-request-reached-safeline-&quot;&gt;How do I know the request reached SafeLine?&lt;/h4&gt;
&lt;p&gt;Resolve the application domain to the SafeLine server, use the port set in Applications, and send the probe to that domain. A request aimed at the upstream address skips the reverse proxy, so it cannot prove detection.&lt;/p&gt;
&lt;h4 id=&quot;what-result-counts-as-a-successful-block-&quot;&gt;What result counts as a successful block?&lt;/h4&gt;
&lt;p&gt;The application guide says the blocking page means the attack was defended. Then open the attack list and click detail, and keep the result only if that event matches the probe you just sent.&lt;/p&gt;
&lt;h4 id=&quot;does-one-blocked-query-prove-every-control-&quot;&gt;Does one blocked query prove every control?&lt;/h4&gt;
&lt;p&gt;No. The published samples cover SQL injection, XSS, path traversal, code injection, and XXE. Rate limiting, CAPTCHA challenge, authentication challenge, and dynamic HTML and JS protection are separate documented capabilities.&lt;/p&gt;
&lt;h4 id=&quot;why-is-a-console-login-not-a-waf-test-&quot;&gt;Why is a console login not a WAF test?&lt;/h4&gt;
&lt;p&gt;The management port shows that the admin UI is reachable. Visitor protection depends on domain, listen port, SSL setting, and upstream. Test that path, not only the login screen.&lt;/p&gt;
&lt;h4 id=&quot;what-if-the-malicious-url-loads-normally-&quot;&gt;What if the malicious URL loads normally?&lt;/h4&gt;
&lt;p&gt;Check DNS, port, and SSL, and confirm you did not call the origin directly. If the path is correct and a documented sample is still not blocked, treat the test as failed and review the application settings before you assume the site is covered.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32356/why-i-test-the-proxy-path-before-i-trust-a-waf-block</guid>
<pubDate>Sun, 25 Oct 2026 02:27:04 +0000</pubDate>
</item>
<item>
<title>How to Test If Your WAF Is Working After Cutover</title>
<link>https://coderlegion.com/32354/how-to-test-if-your-waf-is-working-after-cutover</link>
<description>&lt;p&gt;A console login only proves that the management service answered. It does not prove that public clients are being filtered. SafeLine is a self-hosted web application firewall placed in front of a web application so that it can filter and monitor HTTP traffic and block malicious HTTP and HTTPS requests before they reach the app, following policies that separate malicious traffic from safe traffic (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The application guide describes the same idea in proxy terms: SafeLine is developed based on nginx, receives traffic for the original website, cleans malicious attack traffic, and forwards the remaining traffic to the original application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). A working test has to show that your hostname is on that path, that a documented attack is blocked, and that the console recorded the same attempt.&lt;/p&gt;
&lt;p&gt;Confirm the application path first.&lt;/p&gt;
&lt;p&gt;Protection is configured in the web admin console on the Applications page. Choose Add Application, then enter Domain, Port, and Upstream. Domain is the domain name, hostname, or IP of the original app. Port is what SafeLine will listen on, such as 80 or 443, and HTTPS apps need the SSL option checked. Upstream is the real address SafeLine uses to forward traffic (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). The guide then tells you to resolve that domain to the IP address of the server where SafeLine is located and to access the protected application through that domain.&lt;/p&gt;
&lt;p&gt;Use that sequence as the first half of the test:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The hostname in your test URL must be the Domain you configured.&lt;/li&gt;
&lt;li&gt;Public DNS for that hostname must point at the SafeLine server, not at the upstream host.&lt;/li&gt;
&lt;li&gt;The port in the test must be the listener you set. If clients use HTTPS, the SSL option has to be enabled or you are testing a different service than production.&lt;/li&gt;
&lt;li&gt;Upstream must be the origin you intend to protect. A successful page load after cutover only shows that forwarding works. It does not show that filtering works.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keep the admin URL out of this path check. After installation, the web console is opened at &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt; (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). Reaching that page shows that the management plane is up. It says nothing about whether a visitor to your public site ever touches the proxy.&lt;/p&gt;
&lt;p&gt;Send the published samples, then match them to the attack list.&lt;/p&gt;
&lt;p&gt;The application guide gives five cases and says to replace the example host with your website domain (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Run them only against the application you added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL injection: &lt;code&gt;/?id=1+and+1=2+union+select+1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;XSS: &lt;code&gt;/?id=&amp;lt;img+src=x+onerror=alert()&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Path traversal: &lt;code&gt;/?id=../../../../etc/passwd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Code injection: &lt;code&gt;/?id=phpinfo();system('id')&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;XXE: &lt;code&gt;/?id=&amp;lt;?xml+version=&quot;1.0&quot;?&amp;gt;&amp;lt;!DOCTYPE+foo+SYSTEM+&quot;&quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The documented success signal is the blocking page. After each request, open the SafeLine web console, find the attack list, and click detail. Count the test as passed only when both signals refer to the same attempt: the browser was blocked, and the detail view exists for that request. One signal without the other is incomplete. A normal origin response means the request was not cleaned on that path, so go back to Domain, Port, SSL, Upstream, and DNS before you change anything else.&lt;/p&gt;
&lt;p&gt;Do not stretch these five URLs into a claim about every control.&lt;/p&gt;
&lt;p&gt;The introduction lists many attack types that a WAF of this kind is typically used to address, including SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, bruteforce, HTTP flood, and bot abused (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The same page lists core capabilities: defenses for web attacks, proactive bot abused defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list. The feature list adds rate limiting against DoS attacks, bruteforce attempts, traffic surges, and other abuse; CAPTCHA challenges that allow human users and block crawlers and bots; an authentication challenge that blocks visitors who do not enter the password; and dynamic protection that encrypts HTML and JS on each visit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Those are product facts, not extra test steps. The only click-by-click attack samples in the supplied application guide are the five URLs above. A pass on those URLs supports the web-attack blocking check. It does not prove that rate limiting, CAPTCHA, authentication challenge, dynamic protection, or an access list is enabled. Mark those items untested unless you have a documented procedure for them.&lt;/p&gt;
&lt;p&gt;A sample-set score is a different question from a cutover test. The home documentation publishes an effect evaluation on 33669 samples. In that table, SafeLine Balance is listed at 71.65 percent detection, 0.07 percent false positive, and 99.45 percent accuracy, while SafeLine Strict is listed at 76.17 percent detection, 0.22 percent false positive, and 99.38 percent accuracy (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Use those figures only as published evaluation results. They do not inspect your DNS, your listener, or your upstream. The supplied pages also do not provide a procedure for switching between Balance and Strict, so do not treat the table as a tuning guide.&lt;/p&gt;
&lt;p&gt;When you record the result, store the hostname, port, SSL choice, the five URLs you requested, whether each one returned the blocking page, and whether attack-list detail opened for each one. If you compare by requesting the upstream directly, do that from an admin network you control and treat the response as an origin-only observation. Close that direct path to the public Internet afterward. The documented design is that clients pass through the WAF before reaching the server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A WAF you can bypass is not a WAF you have tested.&lt;/p&gt;
&lt;h4 id=&quot;does-opening-the-console-mean-the-waf-is-working-&quot;&gt;Does opening the console mean the WAF is working?&lt;/h4&gt;
&lt;p&gt;No. The console address &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt; is the management page described in the install guide (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). Filtering starts only after an application is added and clients reach SafeLine on the configured domain and port (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&quot;which-requests-are-the-documented-way-to-test-blocking-&quot;&gt;Which requests are the documented way to test blocking?&lt;/h4&gt;
&lt;p&gt;Use the five samples in the application guide, pointed at your own protected domain: SQL injection, XSS, path traversal, code injection, and XXE. The guide treats the blocking page as evidence that the attack was defended, and it tells you to inspect the attack list and open detail (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&quot;what-should-i-check-if-the-payload-is-not-blocked-&quot;&gt;What should I check if the payload is not blocked?&lt;/h4&gt;
&lt;p&gt;Check the path before you assume a detection miss. The application must use the hostname you requested, listen on that port, have SSL selected for HTTPS, forward to the intended upstream, and have DNS pointed at the SafeLine server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). A normal page from the origin means that request did not pass through the cleaning proxy.&lt;/p&gt;
&lt;h4 id=&quot;do-the-sample-urls-prove-rate-limits-and-bot-checks-&quot;&gt;Do the sample URLs prove rate limits and bot checks?&lt;/h4&gt;
&lt;p&gt;No. Rate limiting, CAPTCHA challenge, authentication challenge, and dynamic HTML and JS protection are documented separately (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The published attack exercise does not include steps for those controls, so a blocked XSS URL is not evidence that they are on.&lt;/p&gt;
&lt;h4 id=&quot;can-the-published-accuracy-table-replace-a-live-test-&quot;&gt;Can the published accuracy table replace a live test?&lt;/h4&gt;
&lt;p&gt;No. The 33669-sample evaluation reports SafeLine Balance and SafeLine Strict metrics (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). It is not a test of your hostname. Keep the live blocking page and the matching attack-list detail as the cutover evidence.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32354/how-to-test-if-your-waf-is-working-after-cutover</guid>
<pubDate>Sun, 25 Oct 2026 02:26:33 +0000</pubDate>
</item>
<item>
<title>How to Reduce WAF False Positives by Classifying the Block First</title>
<link>https://coderlegion.com/32353/how-to-reduce-waf-false-positives-by-classifying-the-block-first</link>
<description>&lt;p&gt;A blocked legitimate request is a false positive. Cutting those blocks is useful only if the same change still stops the attacks you deployed the firewall to catch. SafeLine is a self-hosted web application firewall that filters and monitors HTTP traffic between a web application and the Internet, using policies to separate malicious requests from safe ones (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The supplied documentation does not describe a false-positive exception form, a per-field allow command, or a numeric sensitivity setting you can edit. What it does describe is a reverse-proxy placement, a console attack list with a detail view, several controls that can deny visitors for reasons other than an injection payload, and a published evaluation that reports different false-positive rates for Balance and Strict. This checklist uses only those facts.&lt;/p&gt;
&lt;h3 id=&quot;classify-the-event-before-you-change-policy&quot;&gt;Classify the event before you change policy&lt;/h3&gt;
&lt;p&gt;SafeLine is an HTTP and HTTPS reverse proxy developed on nginx. It receives traffic for the original site, removes malicious attack traffic, and forwards the remaining traffic to the upstream application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). When a test or a user hits a blocking page, open the web console attack list and click detail. That is the documented place to see what was recorded. A blocking page alone does not tell you whether the deny came from a web-attack policy, a rate limit, a challenge, or an authentication check.&lt;/p&gt;
&lt;p&gt;Confirm the protected application is the one you think it is. Adding an application requires a domain, hostname, or IP, a listen port, an SSL option for HTTPS, and the upstream address SafeLine will use to reach the origin. The domain then has to resolve to the SafeLine server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). If DNS still points at the origin, or the upstream is a stale address, the console will not be a reliable picture of user traffic. Fix that routing first. Lowering detection will not repair a proxy that is not in path.&lt;/p&gt;
&lt;h3 id=&quot;separate-attack-denies-from-control-denies&quot;&gt;Separate attack denies from control denies&lt;/h3&gt;
&lt;p&gt;The product home page lists more than one way a visitor can be stopped. Treating every deny as a signature false positive leads to the wrong fix.&lt;/p&gt;
&lt;p&gt;Web-attack defense is aimed at classes such as SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abuse (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A detail record in one of those classes, on a request the application must accept, is the usual meaning of a detection false positive.&lt;/p&gt;
&lt;p&gt;Other documented controls deny clients that may be legitimate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP-based rate limiting throttles traffic that exceeds defined limits. The stated uses are DoS attacks, brute-force attempts, traffic surges, and other abuse (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A busy user or a health check can cross a limit that was set for abuse.&lt;/li&gt;
&lt;li&gt;A CAPTCHA challenge is described as allowing human users while blocking crawlers and bots (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A client that cannot complete the challenge will be blocked even if the URL contains no attack payload.&lt;/li&gt;
&lt;li&gt;An authentication challenge blocks visitors who do not enter the password (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). That is an access gate, not a statement that the request was an exploit.&lt;/li&gt;
&lt;li&gt;Dynamic protection, when turned on, encrypts HTML and JavaScript on each visit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The docs do not call this a false-positive control. After you enable it, verify that the pages users need still work, instead of assuming encryption is unrelated to support tickets.&lt;/li&gt;
&lt;li&gt;A web access control list is named as a core capability (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The supplied pages do not publish rule syntax, so this checklist does not invent an allow entry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Write the class down in one sentence before you touch configuration. A search query blocked as SQL injection is a detection question. A checkout refresh blocked after the rate limit is a limit question. An API client blocked by CAPTCHA is a challenge question. Each one has a different next step.&lt;/p&gt;
&lt;h3 id=&quot;read-balance-and-strict-as-a-published-tradeoff&quot;&gt;Read Balance and Strict as a published tradeoff&lt;/h3&gt;
&lt;p&gt;The effect-evaluation table is the only false-positive measurement in the supplied sources. It uses 33,669 samples for each row (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine Balance: detection 71.65 percent, false positive 0.07 percent, accuracy 99.45 percent.&lt;/li&gt;
&lt;li&gt;SafeLine Strict: detection 76.17 percent, false positive 0.22 percent, accuracy 99.38 percent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same table prints ModSecurity Level 1 at 69.74 percent detection and 17.58 percent false positive, and the CloudFlare row labeled Free at 10.70 percent detection and 0.07 percent false positive. Those are the figures printed on that page. They are not a procedure for editing your own rules, and they are not a forecast for your application.&lt;/p&gt;
&lt;p&gt;On that sample set, Strict detects more and also shows the higher false-positive rate. Balance shows the lower false-positive rate, 0.07 percent, and a lower detection rate than Strict. If the detail view shows ordinary application text being classed as an attack, and your priority on this published comparison is the lower false-positive figure, Balance is the row that matches that priority. If missing attacks matters more than the gap between 0.07 percent and 0.22 percent false positives, Strict is the row that matches that priority. Neither row means false positives are gone.&lt;/p&gt;
&lt;h3 id=&quot;operator-checklist&quot;&gt;Operator checklist&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Reproduce one blocked journey. Open the attack list and click detail. Record the class of the event. If there is no attack detail, do not invent a signature bypass.&lt;/li&gt;
&lt;li&gt;Check domain, port, SSL, and upstream against the real origin, and check that the domain resolves to the SafeLine host. Correct a proxy miss before you discuss detection.&lt;/li&gt;
&lt;li&gt;If the detail is a rate limit, CAPTCHA, or authentication result, adjust the question to that control. Turning off web-attack inspection will not explain a password challenge, and leaving a tight limit on a busy path will keep blocking people who never sent an exploit.&lt;/li&gt;
&lt;li&gt;If the detail is a web-attack class on traffic you must allow, choose Balance or Strict using the published detection and false-positive pair. Record which figure you are optimizing for.&lt;/li&gt;
&lt;li&gt;After any change, replay the documented samples against your own domain: a union-select SQL injection, an image-handler XSS payload, a path traversal toward /etc/passwd, a code-injection payload, and an XXE doctype (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). A blocking page means that sample was defended. If those samples now succeed, coverage dropped. That is not a false-positive fix.&lt;/li&gt;
&lt;li&gt;Replay a known-good journey in the same window: a normal page load, a form post with everyday punctuation, and a repeat request that should stay inside your rate limit. If dynamic protection is on, confirm HTML and JavaScript still behave for that journey, because the feature re-encrypts them on each visit.&lt;/li&gt;
&lt;li&gt;Keep the detail note with the decision. A later reviewer should be able to see why Balance or Strict was chosen, and which control, if any, was the real source of the deny.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The deploy guide is not a tuning guide. It specifies Linux, x86_64 or arm64, Docker 20.10.14 or newer, Docker Compose 2.0.0 or newer, a minimum of 1 CPU core, 1 GB memory, and 5 GB disk, plus an ssse3 CPU check (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). Those requirements tell you whether the instance can run. They do not set a false-positive budget. Environment values such as the console port, image tag, and Postgres password are install settings, not detection settings. Do not add unofficial scripts to suppress a parameter the console has already classified.&lt;/p&gt;
&lt;h3 id=&quot;faq&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;how-do-i-tell-a-false-positive-from-a-normal-block-&quot;&gt;How do I tell a false positive from a normal block?&lt;/h4&gt;
&lt;p&gt;Match the detail view to a request the application is supposed to accept. A web-attack class on that request is a false-positive candidate. A rate-limit, CAPTCHA, or password result can be unwanted, but it is a control outcome, not proof that attack detection misfired.&lt;/p&gt;
&lt;h4 id=&quot;will-balance-mode-remove-false-positives-&quot;&gt;Will Balance mode remove false positives?&lt;/h4&gt;
&lt;p&gt;No. On the published 33,669-sample table, Balance shows a 0.07 percent false-positive rate, and Strict shows 0.22 percent. Lower is not zero, and the table is not your production log.&lt;/p&gt;
&lt;h4 id=&quot;should-every-path-use-captcha-and-authentication-&quot;&gt;Should every path use CAPTCHA and authentication?&lt;/h4&gt;
&lt;p&gt;Not as a false-positive remedy. CAPTCHA is for separating human users from crawlers and bots. Authentication challenge blocks visitors who do not enter the password. Use them where that behavior is what you want. Applying both on every path will deny clients that web-attack detection would have forwarded.&lt;/p&gt;
&lt;h4 id=&quot;where-is-the-blocked-request-explained-&quot;&gt;Where is the blocked request explained?&lt;/h4&gt;
&lt;p&gt;In the web console attack list. Click detail to see the recorded event after the blocking page appears (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&quot;can-the-install-steps-configure-fewer-false-positives-&quot;&gt;Can the install steps configure fewer false positives?&lt;/h4&gt;
&lt;p&gt;No. Installation covers the host requirements, the compose file, environment variables, starting the stack, and resetting the administrator account (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). False-positive decisions belong in the review checklist above: classify the detail, fix proxy setup, then choose between the published Balance and Strict figures and retest both attack samples and known-good journeys.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32353/how-to-reduce-waf-false-positives-by-classifying-the-block-first</guid>
<pubDate>Sun, 25 Oct 2026 02:25:24 +0000</pubDate>
</item>
<item>
<title>How to Reduce WAF False Positives With a Cause Checklist</title>
<link>https://coderlegion.com/32352/how-to-reduce-waf-false-positives-with-a-cause-checklist</link>
<description>&lt;p&gt;A false positive is not one event. On a reverse-proxy web application firewall, a blocking page, a captcha, a password prompt, and a throttled client can all look the same to the person who filed the ticket. Reducing false positives starts by naming which outcome you actually saw, then checking it against published detection data and the controls that were enabled. This checklist stays inside what the SafeLine documentation states. It does not assume an allowlist syntax, a custom exception API, or a tuning command that the cited guides do not describe.&lt;/p&gt;
&lt;p&gt;SafeLine sits in front of the application as an HTTP and HTTPS reverse proxy. Clients reach the firewall first. It filters and monitors traffic, then forwards traffic it treats as safe to the upstream application. The product documentation describes that decision as policy: a set of rules that separate malicious HTTP traffic from safe traffic. Documented attack coverage includes SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abuse (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). If a legitimate request contains a string that resembles one of those patterns, a detection block is possible. That is the narrow meaning of a semantic false positive. Every other interruption needs a different check.&lt;/p&gt;
&lt;h3 id=&quot;separate-detection-blocks-from-intentional-controls&quot;&gt;Separate detection blocks from intentional controls&lt;/h3&gt;
&lt;p&gt;The same documentation lists controls that interrupt clients on purpose. IP-based rate limiting throttles traffic that exceeds defined limits, including denial-of-service patterns, brute-force attempts, and traffic surges. A captcha challenge is meant to admit human users and block crawlers and bots. An authentication challenge requires a password, and visitors who do not enter it are blocked. Dynamic protection encrypts HTML and JavaScript on each visit when that control is turned on (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). None of those behaviors is described as a detection false-positive setting. If a checkout client, a monitoring probe, or a partner integration fails, confirm whether rate limiting, captcha, authentication, or dynamic encryption is enabled before you treat the event as a signature mistake.&lt;/p&gt;
&lt;p&gt;Use a three-way label on every ticket:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Detection false positive: a normal request was classified as an attack such as SQL injection, XSS, or path traversal.&lt;/li&gt;
&lt;li&gt;Control interruption: the client hit a rate limit, a captcha, or a password challenge.&lt;/li&gt;
&lt;li&gt;Content change: dynamic protection rewrote HTML or JavaScript, which can surprise a client even when the request was not blocked as an attack.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Write that label into the ticket before anyone debates signatures. A later change in detection posture will not fix a password challenge, and turning off a challenge will not fix a real injection match.&lt;/p&gt;
&lt;h3 id=&quot;read-balance-and-strict-as-a-tradeoff-not-a-slogan&quot;&gt;Read Balance and Strict as a tradeoff, not a slogan&lt;/h3&gt;
&lt;p&gt;The effect evaluation on the product home page is the documented quantitative evidence for false positives. It uses 33,669 samples for each row. SafeLine Balance is listed at 71.65 percent detection, 0.07 percent false positives, and 99.45 percent accuracy. SafeLine Strict is listed at 76.17 percent detection, 0.22 percent false positives, and 99.38 percent accuracy. In the same table, ModSecurity Level 1 is listed at 69.74 percent detection and 17.58 percent false positives, and CloudFlare Free is listed at 10.70 percent detection and 0.07 percent false positives (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Read those rows as a tradeoff, not as a promise about your own routes. Strict detection is higher, and the published false-positive rate is also higher. Balance keeps the published false-positive rate at 0.07 percent, the same figure shown for CloudFlare Free in that table, with lower detection than Strict. Accuracy is slightly higher for Balance than for Strict in the published table. If the goal is specifically to reduce false positives, the documented comparison points toward the Balance row rather than the Strict row. The guides cited here do not describe a console path or a command for switching those labels, so do not invent one. Treat the table as the decision input. Do not assume a documented switch exists until you can see one in your own deployment.&lt;/p&gt;
&lt;p&gt;Do not extend the table either. It does not report latency, bypass rates on your application, or results for a custom rule pack. If you need a number the page does not publish, leave it unstated.&lt;/p&gt;
&lt;h3 id=&quot;confirm-the-attack-list-belongs-to-the-right-application&quot;&gt;Confirm the attack list belongs to the right application&lt;/h3&gt;
&lt;p&gt;A false-positive review is useless if the record belongs to a different site. The application guide says SafeLine is a web application firewall developed based on nginx. It receives traffic for the original website, cleans malicious attack traffic, and forwards safe and reliable traffic to the original application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). When you add an application you set Domain, Port, an SSL option for HTTPS apps, and Upstream. Domain can be a domain name, a hostname, or an IP address. After that, you resolve the entered domain to the IP address of the server where SafeLine is located.&lt;/p&gt;
&lt;p&gt;Before you call a block a false positive, check four facts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The domain or hostname on the request matches the application entry.&lt;/li&gt;
&lt;li&gt;The listening port, and the SSL option for HTTPS, match how clients actually connect.&lt;/li&gt;
&lt;li&gt;Upstream is the real address of the original application, not a stale host.&lt;/li&gt;
&lt;li&gt;The attack-list entry you opened is for that same application, and you opened detail rather than judging from the summary line alone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The application guide also shows what a successful defense looks like. Sample probes for SQL injection, XSS, path traversal, code injection, and XXE should produce a blocking page, and the console attack list should show the event. Open detail for the specific record (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Use those samples only on a host you are authorized to test, and replace the example domain with your own, so you know the shape of a true positive. A legitimate URL that lacks those payloads and still appears in the attack list is the record worth keeping.&lt;/p&gt;
&lt;h3 id=&quot;run-the-checklist-without-undocumented-features&quot;&gt;Run the checklist without undocumented features&lt;/h3&gt;
&lt;p&gt;Work in this order. Stop when the cause is explained.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Save the full request: method, path, query string, the headers you are allowed to store, and the response the user saw.&lt;/li&gt;
&lt;li&gt;Label it as a detection block, a rate limit, a captcha, an authentication challenge, or a dynamic-protection side effect. Only the first label is a semantic false positive.&lt;/li&gt;
&lt;li&gt;Open the attack list and the detail view. If there is no detection record, do not force the event into the detection bucket.&lt;/li&gt;
&lt;li&gt;Compare the payload with the documented attack examples. A union-select string, an onerror handler, a traversal sequence, a code-injection string, or an XXE doctype is not a false positive just because a tester sent it on purpose.&lt;/li&gt;
&lt;li&gt;If the request is ordinary application traffic and it was detected, note the published Balance versus Strict false-positive gap before you ask for a broader bypass.&lt;/li&gt;
&lt;li&gt;If the interruption came from rate limiting, captcha, or authentication, change the question. Ask whether that control should apply to this client. The documentation defines what those controls do. It does not define a per-URL exception language in the pages cited here.&lt;/li&gt;
&lt;li&gt;After any posture change you can actually confirm, re-test one known-bad sample and one known-good business URL. You want the bad sample blocked and the good URL absent from the attack list.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This sequence reduces false positives by refusing to mix causes. It also avoids promising an integration, a rule dialect, or a whitelist feature that these sources do not provide. If a review needs an exception mechanism, say that the cited guides do not document one, and keep the evidence pack: request, detail view, control state, and which published row you were comparing.&lt;/p&gt;
&lt;h4 id=&quot;does-a-lower-false-positive-rate-always-mean-better-protection-&quot;&gt;Does a lower false-positive rate always mean better protection?&lt;/h4&gt;
&lt;p&gt;No. In the published evaluation, Balance shows 0.07 percent false positives and 71.65 percent detection. Strict shows 0.22 percent false positives and 76.17 percent detection. Accuracy is 99.45 percent for Balance and 99.38 percent for Strict (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Lower false positives in that table come with lower detection. Pick the row that matches the risk you accept, and do not describe either row as universally better.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-tell-a-detection-block-from-a-challenge-or-a-rate-limit-&quot;&gt;How do I tell a detection block from a challenge or a rate limit?&lt;/h4&gt;
&lt;p&gt;Check the user-visible result and the console record together. A detection event should appear in the attack list, and detail should describe that event (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). A captcha, a password prompt, or throttling matches the documented captcha challenge, authentication challenge, or rate limiting behavior (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). If the console has no attack detail, treat the case as a control interruption until evidence says otherwise.&lt;/p&gt;
&lt;h4 id=&quot;should-i-send-the-sample-attack-urls-to-a-live-customer-site-&quot;&gt;Should I send the sample attack URLs to a live customer site?&lt;/h4&gt;
&lt;p&gt;Use them only on an application you are authorized to test, and replace the example domain with your own, as the guide instructs (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Their job is to show what a blocking page and an attack-list entry look like. They are not a false-positive test. A probe that contains a union select or a path-traversal sequence is expected to be blocked.&lt;/p&gt;
&lt;h4 id=&quot;what-if-i-cannot-find-an-allowlist-or-exception-command-&quot;&gt;What if I cannot find an allowlist or exception command?&lt;/h4&gt;
&lt;p&gt;Do not invent one. The cited home page and application guide describe proxy setup, attack defense, rate limiting, captcha, authentication challenge, dynamic protection, and the Balance versus Strict evaluation. They do not document a false-positive exception syntax. Reduce noise by classifying the event, reviewing attack detail, and choosing the published row whose false-positive rate matches your goal.&lt;/p&gt;
&lt;h4 id=&quot;what-should-the-next-reviewer-keep-so-the-debate-is-not-repeated-&quot;&gt;What should the next reviewer keep so the debate is not repeated?&lt;/h4&gt;
&lt;p&gt;Keep the request URL, the control that was enabled, whether attack detail existed, and the published figures you used: sample count 33,669, Balance false positives 0.07 percent, and Strict false positives 0.22 percent (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Also keep the application domain, port, SSL choice, and upstream (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). That pack is enough to decide whether the next step is a posture review or a control-scope review.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32352/how-to-reduce-waf-false-positives-with-a-cause-checklist</guid>
<pubDate>Sun, 25 Oct 2026 02:24:52 +0000</pubDate>
</item>
<item>
<title>Why I Protect Only Some Homelab Services With a WAF</title>
<link>https://coderlegion.com/32229/why-i-protect-only-some-homelab-services-with-a-waf</link>
<description>&lt;p&gt;A public hostname changes what a homelab service is. A notes app, a media index, or an admin panel that answers from outside the house is no longer a LAN convenience. It is a web application on the internet, and it can be probed for the same injection, traversal, and abuse patterns aimed at any other site. I place a self-hosted WAF in front of those services when, and only when, I can publish them as HTTP or HTTPS through a reverse proxy. I do not treat that choice as a blanket rule for every container on the network.&lt;/p&gt;
&lt;p&gt;SafeLine is a self-hosted web application firewall meant to protect web apps by filtering and monitoring HTTP traffic between the application and the internet. Deployed in front of the app, it works as a reverse proxy: clients pass through it before they reach the server, and it blocks malicious HTTP and HTTPS traffic while forwarding what its policies treat as safe. The same description says it also aims to prevent unauthorized data from leaving the app. Those statements are the product model I rely on, and they come from the project documentation at &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The attack list is specific enough to use as a decision filter. The introduction names SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abuse. Core capabilities listed alongside that coverage are defenses for web attacks, proactive bot-abuse defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list. Rate limiting throttles traffic above defined limits to defend against DoS attacks, brute-force attempts, traffic surges, and other abuse. A CAPTCHA challenge is documented as allowing human users while blocking crawlers and bots. An authentication challenge blocks visitors who do not enter the required password. Dynamic protection, when turned on, encrypts HTML and JS from the web server on each visit. I cite that feature set from &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt; rather than assuming extra homelab plugins.&lt;/p&gt;
&lt;p&gt;That scope also tells me what not to expect. The configuration guide says SafeLine is developed on nginx and acts as an HTTP and HTTPS reverse proxy: it receives traffic for the original site, cleans malicious traffic, and forwards the rest to the upstream application, as described at &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;. A database port or an SSH listener is not that kind of application. Putting a WAF hostname in front of them is not a documented protection path, so I leave them off this design.&lt;/p&gt;
&lt;p&gt;Before I move a self-hosted service, I run a short go or no-go list.&lt;/p&gt;
&lt;p&gt;The app must be reachable as a web origin. In the console, Add Application asks for a domain, hostname, or IP, a listen port such as 80 or 443, and an upstream address. HTTPS apps need the SSL option checked. After saving, the domain must resolve to the IP of the SafeLine server. If I cannot make that DNS change, I do not pretend the app is protected.&lt;/p&gt;
&lt;p&gt;The host must meet the install floor in &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;. That guide requires Linux, x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, and at least 1 CPU core, 1 GB of memory, and 5 GB of disk. The CPU must support ssse3. I confirm those facts with the documented commands: uname -m, docker version, docker compose version, cat /proc/cpuinfo | grep &quot;processor&quot;, free -h, df -h, and lscpu | grep ssse3. A homelab node that fails any line is not a candidate, even if the web app itself is small.&lt;/p&gt;
&lt;p&gt;Architecture has a license constraint I do not skip. For ARM, the guide sets ARCH_SUFFIX to -arm and uses the ARM Postgres image. It also states that SafeLine on ARM requires a Pro license to work properly, and that the Personal Edition is not supported on ARM. An ARM box can look ideal for a quiet homelab and still be the wrong edition.&lt;/p&gt;
&lt;p&gt;Release choice is part of the same checklist. Setting RELEASE to -lts selects the LTS build, but the deploy guide says the LTS version will no longer be maintained starting from 9.1.0-LTS on 14 August 2025, and it strongly recommends upgrading to the latest version. I stay on the current release unless I have a concrete reason not to.&lt;/p&gt;
&lt;p&gt;The recommended install is the automated English command from that same deploy page, and it needs root: bash -c &quot;$(curl -fsSLk &lt;a rel=&quot;nofollow&quot; href=&quot;https://waf.chaitin.com/release/latest/manager.sh&quot;&gt;https://waf.chaitin.com/release/latest/manager.sh&lt;/a&gt;)&quot; -- --en. Manual setup is also documented: create /data/safeline with at least 5 GB free, download the compose file, write .env, generate a 64-character hex detector management token, a 64-character hex management internal token, and a 16-character alphanumeric detector AES key, lock down permissions, then start with docker compose up -d. The console opens at &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt;. The initial administrator account comes from docker exec safeline-mgt resetadmin, and the printed username and password have to be saved then. The deploy page remains the source for SAFELINE_DIR, IMAGE_TAG, MGT_PORT, POSTGRES_PASSWORD, SUBNET_PREFIX, and the remaining variables.&lt;/p&gt;
&lt;p&gt;Once the console is up, I add one application, point DNS at the SafeLine host, and test with the sample requests in the application guide: a SQL injection query string, an XSS payload, a path traversal payload, a code injection payload, and an XXE payload, with my domain in place of the example host. A blocking page means the request was stopped. I then open the attack list and click detail so the event is confirmed in the console, not only in the browser.&lt;/p&gt;
&lt;p&gt;Published evaluation numbers are a policy warning, not a promise about my apps. On 33,669 samples, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt; reports SafeLine Balance at 71.65 percent detection, 0.07 percent false positives, and 99.45 percent accuracy, and SafeLine Strict at 76.17 percent detection, 0.22 percent false positives, and 99.38 percent accuracy. Strict handling detects more and also raises the false-positive figure. After I enable stricter handling, I retest ordinary actions such as login and upload before I call the site done. The docs call the product production-ready; I still watch the first real clients.&lt;/p&gt;
&lt;p&gt;I also keep the management plane boring. MGT_PORT defaults to 9443 in the sample environment, and MGT_PROXY is only for extra proxy layers in front of the console. It should stay at 0 unless I am actually configuring that proxy. If I retire the install, the documented path is to enter the SafeLine directory, run docker compose down, and remove that directory. Community support is Discord, including the #FAQ channel, plus GitHub issues, as noted at &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The decision is narrow. Use this WAF when a self-hosted web service must be reached from outside, when DNS can target the reverse proxy, and when the host matches the documented platform rules. Do not use it as a reason to publish services that should stay private, and do not describe it as an integration with a specific tunnel, panel, or orchestrator. The supported path is the one in the application guide: domain, port, upstream, and a domain that resolves to SafeLine.&lt;/p&gt;
&lt;h4 id=&quot;which-self-hosted-services-should-sit-behind-a-waf-&quot;&gt;Which self-hosted services should sit behind a WAF?&lt;/h4&gt;
&lt;p&gt;Only web apps you can publish as HTTP or HTTPS. SafeLine receives traffic for the original site, cleans malicious requests, and forwards the rest to the upstream, which is the model in &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;. Non-web listeners are outside that guide.&lt;/p&gt;
&lt;h4 id=&quot;is-a-small-homelab-host-enough-&quot;&gt;Is a small homelab host enough?&lt;/h4&gt;
&lt;p&gt;The documented minimum is 1 CPU core, 1 GB of memory, and 5 GB of disk, on Linux with Docker 20.10.14 or newer, Docker Compose 2.0.0 or newer, and a CPU with ssse3, per &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;. ARM also requires a Pro license. The Personal Edition is not supported on ARM.&lt;/p&gt;
&lt;h4 id=&quot;what-do-i-enter-for-one-public-site-&quot;&gt;What do I enter for one public site?&lt;/h4&gt;
&lt;p&gt;Add an application with the domain, hostname, or IP, the listen port, and the upstream address. Check SSL for HTTPS. Resolve that domain to the SafeLine server IP, as described at &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;. Rate limiting, CAPTCHA, authentication challenge, and dynamic HTML or JS encryption are separate controls from &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;how-can-i-verify-that-a-probe-was-blocked-&quot;&gt;How can I verify that a probe was blocked?&lt;/h4&gt;
&lt;p&gt;Send the documented SQL injection, XSS, path traversal, code injection, and XXE examples to your own domain. A blocking page means the defense fired. Open the attack list and click detail to confirm the record.&lt;/p&gt;
&lt;h4 id=&quot;does-this-replace-private-networking-or-app-login-&quot;&gt;Does this replace private networking or app login?&lt;/h4&gt;
&lt;p&gt;No. It filters traffic for web apps you choose to expose. It does not patch the upstream or justify publishing a service that should remain private. If you remove the install, use docker compose down and delete the install directory, following &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32229/why-i-protect-only-some-homelab-services-with-a-waf</guid>
<pubDate>Sat, 24 Oct 2026 02:25:33 +0000</pubDate>
</item>
<item>
<title>How to Choose a WAF for a Homelab Before You Publish Anything</title>
<link>https://coderlegion.com/32228/how-to-choose-a-waf-for-a-homelab-before-you-publish-anything</link>
<description>&lt;p&gt;A homelab rarely fails in one dramatic way. It fails when a useful web app is reachable, a password form is guessable, and nobody has decided which requests are allowed to touch the origin. A WAF can help, but only if you treat it as a reverse proxy with a defined job, not as a label you place on every container.&lt;/p&gt;
&lt;p&gt;SafeLine is documented as a self-hosted WAF that protects web apps by filtering and monitoring HTTP traffic between a web application and the Internet. Deployed in front of an app, it is a reverse proxy: clients reach the WAF first, and the WAF forwards traffic it considers safe to the origin while blocking malicious HTTP and HTTPS requests and unauthorized data leaving the app. That model is the whole decision. If a self-hosted service is not an HTTP or HTTPS application you can place behind that proxy, this checklist should stop you from promising protection the product docs do not describe. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;sort-services-before-you-sort-controls&quot;&gt;Sort services before you sort controls&lt;/h3&gt;
&lt;p&gt;Write down every service you want to protect and mark only those that speak HTTP or HTTPS. A photo library, a notes site, a dashboard, or a small API can belong on the list when you can name a domain, hostname, or IP, a listen port, and an upstream address. A database port, a raw game server, or a protocol that never becomes an HTTP request does not become a WAF application just because it runs on the same host.&lt;/p&gt;
&lt;p&gt;The official application flow is concrete. In the Web Admin Console, open Applications and choose Add Application. Enter the original app domain, hostname, or IP. Enter the port SafeLine will listen on, such as 80 or 443, and check the SSL option for HTTPS apps. Enter the upstream, which is the real address used to forward traffic. After that, resolve the name you entered to the IP of the server where SafeLine runs, then reach the protected app through that name. If you cannot complete those four facts, the service is not ready for this path. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Keep the origin from being a shortcut. The value of the proxy is that clients pass through it before they reach the server. If the same app is still published on a second port, a second hostname, or a direct LAN address that bypasses the WAF, the checklist is unfinished even if the console shows a healthy application.&lt;/p&gt;
&lt;h3 id=&quot;match-documented-threats-to-homelab-exposure&quot;&gt;Match documented threats to homelab exposure&lt;/h3&gt;
&lt;p&gt;The product documentation names a wide set of web attacks, including SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abuse. Core capabilities listed alongside that coverage are web-attack defense, proactive bot-abuse defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For a homelab, translate those names into exposure, not into a feature tour. A form or query string that reaches a database-backed app is a reason to care about injection and path traversal. A login page on a name that resolves from outside the house is a reason to care about brute force. A site that suddenly attracts scripted clients is a reason to care about bots and floods. An app you only use over a trusted VPN may still deserve the proxy if the origin would be dangerous when that VPN rule is wrong, but the checklist should say so explicitly.&lt;/p&gt;
&lt;p&gt;Do not invent a connector for a particular self-hosted brand. The supplied docs describe a generic reverse-proxy application. They do not document a special integration for any homelab suite. If an app needs a custom header, a long-lived connection, or an existing proxy in front of it, test that behavior yourself and treat anything beyond domain, port, upstream, and DNS as unverified.&lt;/p&gt;
&lt;h3 id=&quot;pick-controls-by-failure-mode&quot;&gt;Pick controls by failure mode&lt;/h3&gt;
&lt;p&gt;Blocking web attacks is the baseline. The feature list says SafeLine defends against web attacks such as SQL injection, XSS, code injection, OS command injection, CRLF injection, XXE, SSRF, and path traversal. Rate limiting is separate. The docs describe it as a way to throttle traffic that exceeds defined limits, aimed at DoS attacks, brute-force attempts, traffic surges, and other abuse. A CAPTCHA challenge is for bot attacks: human users are allowed through, while crawlers and bots are blocked. An authentication challenge is a password gate: when it is on, visitors must enter the password or they are blocked. Dynamic protection is different again: when it is on, HTML and JS from the web server are dynamically encrypted on each visit. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A practical homelab mapping looks like this. Use attack blocking for any app whose parameters, uploads, or paths are reachable. Add rate limiting where login, search, or API routes can be hammered. Consider CAPTCHA where anonymous bots, not forgotten passwords, are the problem. Use the authentication challenge only when a shared password gate is acceptable for every visitor of that application, because it will block people who do not have that password. Turn on dynamic protection when you specifically want HTML and JS encrypted per visit, and verify that your own pages still work. None of these toggles replaces patching the origin app.&lt;/p&gt;
&lt;p&gt;Published evaluation numbers are a tuning warning, not a score you should paste onto your hardware. On 33669 samples, the docs report SafeLine Balance at 71.65 percent detection, 0.07 percent false positives, and 99.45 percent accuracy, and SafeLine Strict at 76.17 percent detection, 0.22 percent false positives, and 99.38 percent accuracy. Strict raises detection and also raises the false-positive rate compared with Balance. For a homelab, that means you should watch the attack list after you change policy, especially if household tools start failing on ordinary requests. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;confirm-the-host-can-carry-the-proxy&quot;&gt;Confirm the host can carry the proxy&lt;/h3&gt;
&lt;p&gt;The deploy guide states minimums: Linux; x86_64 or arm64; Docker 20.10.14 or above; Docker Compose 2.0.0 or above; 1 CPU core, 1 GB memory, and 5 GB disk; and a CPU with SSSE3. Documented checks include uname -m, docker version, docker compose version, processor count, free -h, df -h, and lscpu | grep ssse3. A small lab box can meet the minimum and still feel tight once logs, database data, and several proxied apps share that 1 GB. Plan disk beyond the 5 GB floor if you expect to keep attack history.&lt;/p&gt;
&lt;p&gt;ARM needs an extra decision. The deploy guide says SafeLine installed on ARM requires a Pro license to work properly, and that the Personal Edition is not supported on ARM. An arm64 homelab board is therefore not the same choice as an x86_64 mini PC. If you are looking at the LTS channel, note that LTS is no longer maintained starting from 9.1.0-LTS (14 August 2025), and the docs strongly recommend upgrading to the latest version. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The console itself is part of the exposure review. After install, the web console is &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt;. The initial admin account is retrieved with docker exec safeline-mgt resetadmin. Treat that management port as a privileged surface: it is how you add applications and read attack detail, so it should not be casually published beside the apps you are trying to protect.&lt;/p&gt;
&lt;h3 id=&quot;prove-the-path-with-the-documented-tests&quot;&gt;Prove the path with the documented tests&lt;/h3&gt;
&lt;p&gt;After DNS points at the SafeLine host, use the official test cases with your own domain in place of the example host. The docs give SQL injection as /?id=1+and+1=2+union+select+1, XSS as /?id=&amp;lt;img+src=x+onerror=alert()&amp;gt;, path traversal as /?id=../../../../etc/passwd, code injection as /?id=phpinfo();system('id'), and an XXE-style query. A blocking page means the attack was defended. Then open the console attack list and click detail so you can see what was recorded, not only what the browser showed. Source: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Repeat one normal visit after each test. A homelab WAF that blocks the sample attacks and also blocks your own bookmark is not finished. The docs state that SafeLine is production-ready, but that statement does not mean every policy is correct for your apps. Your proof is the proxy path, the block page, the attack detail, and a clean legitimate request.&lt;/p&gt;
&lt;h4 id=&quot;does-a-homelab-waf-cover-every-self-hosted-service-&quot;&gt;Does a homelab WAF cover every self-hosted service?&lt;/h4&gt;
&lt;p&gt;No. The documented role is an HTTP and HTTPS reverse proxy in front of a web application. Services that you cannot describe with a domain, hostname, or IP, a listen port, and an upstream should stay outside this design until you have a real web path for them.&lt;/p&gt;
&lt;h4 id=&quot;which-homelab-host-facts-are-actually-required-&quot;&gt;Which homelab host facts are actually required?&lt;/h4&gt;
&lt;p&gt;The deploy guide requires Linux on x86_64 or arm64, Docker 20.10.14 or newer, Docker Compose 2.0.0 or newer, at least 1 core, 1 GB of memory, 5 GB of disk, and SSSE3. ARM installs need a Pro license; the Personal Edition is not supported on ARM.&lt;/p&gt;
&lt;h4 id=&quot;should-i-enable-every-challenge-on-day-one-&quot;&gt;Should I enable every challenge on day one?&lt;/h4&gt;
&lt;p&gt;Not by default. Rate limiting targets excess traffic, brute force, surges, and abuse. CAPTCHA targets bots. The authentication challenge blocks visitors who do not enter its password. Dynamic protection encrypts HTML and JS on each visit. Enable the control that matches the failure you are seeing, then retest a normal session.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-know-the-waf-not-another-hop-blocked-the-request-&quot;&gt;How do I know the WAF, not another hop, blocked the request?&lt;/h4&gt;
&lt;p&gt;Use the documented attack URLs against the name that resolves to the SafeLine server. A blocking page is the first sign. The console attack list and its detail view are the second. If the origin is still reachable on another address, fix that bypass before you trust the result.&lt;/p&gt;
&lt;h4 id=&quot;what-should-i-leave-off-this-checklist-&quot;&gt;What should I leave off this checklist?&lt;/h4&gt;
&lt;p&gt;Leave off claims the sources do not make: special integrations for named homelab apps, extra protocols, pricing, and any promise that a minimum lab host will behave like a large deployment. Also leave the management console unpublished to the same audience as the apps, and prefer a maintained release over the unmaintained LTS line if you are choosing a version now.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32228/how-to-choose-a-waf-for-a-homelab-before-you-publish-anything</guid>
<pubDate>Sat, 24 Oct 2026 02:25:01 +0000</pubDate>
</item>
<item>
<title>How to Protect a Next.js App with a WAF Before You Change DNS</title>
<link>https://coderlegion.com/32136/how-to-protect-a-next-js-app-with-a-waf-before-you-change-dns</link>
<description>&lt;p&gt;A Next.js app is still a web application that speaks HTTP. That is the only placement fact you need before you look for a framework plugin. The SafeLine documents used here do not describe a Next.js SDK, App Router hook, or hosting-platform add-on. Treat protection as a reverse-proxy decision, then walk a checklist before you move DNS.&lt;/p&gt;
&lt;p&gt;SafeLine is a self-hosted web application firewall. Its documentation says it filters and monitors HTTP traffic between a web application and the Internet, and that it works as a reverse proxy so clients reach the WAF before they reach the origin server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The application guide says SafeLine is developed based on nginx, receives traffic for the original website, cleans malicious attack traffic, and forwards safe traffic to the upstream application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). For a Next.js deployment, the upstream is the address that actually serves the app, such as a Node process, a container, or another proxy you already operate. Do not add an undocumented Next.js middleware path and treat that path as the firewall.&lt;/p&gt;
&lt;h3 id=&quot;placement-checklist&quot;&gt;Placement checklist&lt;/h3&gt;
&lt;p&gt;Start with exposure. If users already reach the app by a domain over HTTP or HTTPS, you can put SafeLine on that path. In the Web Admin Console, open Applications, choose Add Application, and enter Domain, Port, and Upstream. Domain can be a domain name, hostname, or IP address. Port is the port SafeLine listens on, such as 80 or 443, and HTTPS apps should use the SSL option. Upstream is the real address SafeLine will forward to (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). After those fields are saved, resolve the domain to the IP address of the server where SafeLine runs. Until that DNS change is correct, and until you have written down the previous origin address for rollback, the checklist is unfinished.&lt;/p&gt;
&lt;p&gt;Confirm the host can run the proxy. The install guide requires Linux, x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, and at least 1 CPU core, 1 GB memory, and 5 GB disk. The CPU must support ssse3 (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). On ARM, the same guide says SafeLine requires a Pro license to work properly and that the Personal Edition is not supported. If the machine in front of Next.js is ARM and you expected the Personal Edition to run there, stop and choose another architecture or a licensed Pro install. The guide also says the LTS line will no longer be maintained starting from 9.1.0-LTS (14 August 2025), and it recommends the latest version if you have concerns about staying on that line.&lt;/p&gt;
&lt;p&gt;Choose controls from the documented list only. The product page lists defenses for web attacks, proactive bot abused defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Named coverage includes SQL injection, XSS, code injection, os command injection, CRLF injection, ldap injection, xpath injection, RCE, XXE, SSRF, path traversal, backdoor, bruteforce, http-flood, and bot abused. Rate limiting throttles traffic that exceeds defined limits, including DoS attacks, bruteforce attempts, traffic surges, and other abuse. A CAPTCHA challenge is described as allowing human users through while blocking crawlers and bots. An authentication challenge, when turned on, requires visitors to enter the password or be blocked. Dynamic protection, when turned on, dynamically encrypts HTML and JS code on each visit.&lt;/p&gt;
&lt;p&gt;Those controls are relevant because a Next.js app still emits HTML and JavaScript and still accepts HTTP requests on pages, route handlers, and other endpoints. They do not replace validation, authorization, or secret handling in application code. Nothing in these sources says dynamic encryption understands a particular Next.js rendering mode, or that it replaces a policy you set in the app. There is also no documented promise that a strict policy will ignore harmless JSON, file uploads, or query strings that your routes legitimately use. That is why the checklist includes a real-user retest, not only attack samples.&lt;/p&gt;
&lt;p&gt;As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price. The documentation also calls the product production-ready, protecting over 1,000,000 websites and handling over 30,000,000,000 HTTP requests daily (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Read those scale statements as product context, not as a forecast for your own site. The same page reports an effect evaluation on 33669 samples: SafeLine, Balance showed 71.65% detection, 0.07% false positives, and 99.45% accuracy, while SafeLine, Strict showed 76.17% detection, 0.22% false positives, and 99.38% accuracy. Match the stricter profile to a site that can tolerate more false positives, and retest real Next.js routes before you leave it on.&lt;/p&gt;
&lt;h3 id=&quot;verification-checklist&quot;&gt;Verification checklist&lt;/h3&gt;
&lt;p&gt;After the application is proxied, use the test cases in the application guide and replace the sample domain with yours. The guide lists SQL injection, XSS, path traversal, code injection, and XXE-style query examples (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). A blocking page means SafeLine stopped that request. Then open the console attack list and use the detail view. Also request a normal page, a client-side navigation, and one legitimate POST that your users need. A proxy that stops the samples but breaks a real form is not done.&lt;/p&gt;
&lt;p&gt;Keep the management console off the public app hostname unless you intend to expose it. The install guide opens the console at &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt; and creates the first administrator with docker exec safeline-mgt resetadmin (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). Store that initial password outside the Next.js repository. Record the upstream URL, the listen port, whether SSL is enabled, and the DNS rollback value in the same change note.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-ship-a-next-js-integration-&quot;&gt;Does SafeLine ship a Next.js integration?&lt;/h4&gt;
&lt;p&gt;No. The install guide, the application guide, and the product overview used here describe a reverse proxy and an application record. They do not describe a Next.js plugin, middleware package, or platform add-on. The working record is domain, listen port, SSL when needed, and upstream.&lt;/p&gt;
&lt;h4 id=&quot;can-the-next-js-process-keep-its-current-port-&quot;&gt;Can the Next.js process keep its current port?&lt;/h4&gt;
&lt;p&gt;Yes, if that port is the upstream SafeLine forwards to. SafeLine listens on the port you configure, commonly 80 or 443, while the origin can remain on an internal port. The public domain must resolve to the SafeLine server, which is the change you should not make until the checklist above is filled in.&lt;/p&gt;
&lt;h4 id=&quot;which-next-js-defects-does-this-checklist-remove-&quot;&gt;Which Next.js defects does this checklist remove?&lt;/h4&gt;
&lt;p&gt;It does not patch framework defects. It can filter HTTP attack classes named in the product documentation, throttle traffic over defined limits, challenge bots, require a password gate, and encrypt HTML and JS when dynamic protection is enabled. Authorization inside route handlers remains an application problem.&lt;/p&gt;
&lt;h4 id=&quot;should-every-challenge-be-enabled-on-the-first-day-&quot;&gt;Should every challenge be enabled on the first day?&lt;/h4&gt;
&lt;p&gt;No. CAPTCHA, the authentication challenge, rate limiting, and dynamic HTML and JS encryption are separate features. Turn on the ones that match abuse you can name, then repeat the legitimate page and POST checks. A public marketing route and a signed-in app route do not need the same gate.&lt;/p&gt;
&lt;h4 id=&quot;which-host-choice-blocks-the-personal-edition-&quot;&gt;Which host choice blocks the Personal Edition?&lt;/h4&gt;
&lt;p&gt;ARM does. The deploy guide says a Pro license is required on ARM and that the Personal Edition is not supported there. Before you call the checklist complete, also confirm Docker, Docker Compose, disk, memory, and the ssse3 instruction on the SafeLine host, and prefer a maintained release over the unmaintained LTS line.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32136/how-to-protect-a-next-js-app-with-a-waf-before-you-change-dns</guid>
<pubDate>Fri, 23 Oct 2026 04:02:28 +0000</pubDate>
</item>
<item>
<title>How to Protect a Next.js App When No Framework Plugin Exists</title>
<link>https://coderlegion.com/32137/how-to-protect-a-next-js-app-when-no-framework-plugin-exists</link>
<description>&lt;p&gt;If you are asking how to protect a Next.js app with a WAF, start by rejecting the idea of a hidden framework connector. The SafeLine documents supplied here never mention Next.js, React Server Components, a middleware file, or a platform add-on. They describe a self-hosted web application firewall that sits in front of a web application and filters HTTP traffic. The honest guide is a decision checklist: either your Next.js origin can sit behind that reverse proxy, or this product path does not fit. Do not fill the gap with an integration the sources do not describe.&lt;/p&gt;
&lt;p&gt;SafeLine protects web apps by filtering and monitoring HTTP traffic between the application and the Internet. Deployed in front of the app, it is a reverse proxy: clients pass through it before they reach the server, and it blocks malicious HTTP and HTTPS traffic according to policy (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The application guide adds that SafeLine is developed based on nginx, receives traffic for the original site, cleans malicious attack traffic, and forwards safe traffic to the upstream application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). A Next.js server is in scope only as that upstream. Page routes, API routes, and form posts are protected to the extent they arrive as HTTP requests the proxy can see.&lt;/p&gt;
&lt;h3 id=&quot;run-the-fit-checklist-before-dns-cutover&quot;&gt;Run the fit checklist before DNS cutover&lt;/h3&gt;
&lt;p&gt;Work through these gates in order. A later control cannot repair a failed gate.&lt;/p&gt;
&lt;p&gt;First, confirm you own an upstream address. In the console you add an application with a Domain, a listen Port, and an Upstream. Domain may be a domain name, a hostname, or an IP address. Port is what SafeLine listens on, such as 80 or 443, and HTTPS applications should use the SSL option. Upstream is the real address of the original app (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). For Next.js, that upstream is the host and port of the Node process or container you actually run. If the app is hosted where you cannot place your own reverse proxy in front of it, stop. These pages do not document another mode.&lt;/p&gt;
&lt;p&gt;Second, plan the client path. After the application record exists, you resolve the domain to the IP of the SafeLine server and reach the protected app through that domain. If visitors can still open the Next.js port directly, the WAF is optional and the exposure remains. Write the public port and the upstream port on two lines so Upstream never points back at SafeLine itself.&lt;/p&gt;
&lt;p&gt;Third, check the WAF host against the deploy guide before you promise a launch date. SafeLine expects Linux on x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, and at least 1 CPU core, 1 GB of memory, and 5 GB of disk. The CPU also needs the ssse3 instruction (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). An ARM install requires a Pro license to work properly. The Personal Edition is not supported on ARM. The LTS release is no longer maintained starting from 9.1.0-LTS on 14 August 2025, and the guide strongly recommends moving to the latest version, or waiting about a month after a new release if you want a calmer upgrade.&lt;/p&gt;
&lt;p&gt;Fourth, separate the management plane from the app plane. The web console is served at &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt;. The initial administrator account is created with docker exec safeline-mgt resetadmin, which prints the initial username and password. Store that password. Do not assume the console is protected just because the Next.js site is.&lt;/p&gt;
&lt;p&gt;Fifth, decide which documented controls match this app, and leave the rest off until you have evidence. The core list is defenses for web attacks, proactive bot abused defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Rate limiting is documented against DoS attacks, brute-force attempts, traffic surges, and other abuse. A CAPTCHA challenge is documented to allow human users and block crawlers and bots. An authentication challenge requires a password before the visitor continues. Dynamic protection, when turned on, dynamically encrypts HTML and JS from the web server on each visit.&lt;/p&gt;
&lt;h3 id=&quot;map-those-controls-onto-next-js-without-inventing-a-parser&quot;&gt;Map those controls onto Next.js without inventing a parser&lt;/h3&gt;
&lt;p&gt;Next.js does not get a special inspection profile in these documents. What you can say is narrower and still useful. A production Next.js app usually publishes HTML, JavaScript, and JSON over HTTP. Those are the surfaces the documented feature list talks about. The attack categories named on the product home page include SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abuse, among others. The application guide uses query-string trial cases for SQL injection, XSS, path traversal, code injection, and XXE, then expects a blocking page and an entry in the attack list with a detail view.&lt;/p&gt;
&lt;p&gt;Use that as a verification method, not as a claim that every Next.js bug class is covered. Replay the guide sample cases against your domain after DNS points at SafeLine. Confirm the block page. Open the attack detail. Then exercise a normal page load, a normal API call, and a normal form post so you can see whether a strict policy collides with legitimate traffic. The home page publishes an evaluation table, but this checklist does not treat that table as a sizing tool for your app.&lt;/p&gt;
&lt;p&gt;Rate limiting belongs in the first tuning pass if the Next.js app has a login, a search box, or any route that triggers expensive server work. Bot and CAPTCHA controls belong next if anonymous clients scrape or hammer the site. The authentication challenge is a site gate, not your session implementation. Dynamic HTML and JS encryption is a documented option for pages that serve HTML and JS, which Next.js does, but the docs do not say it is required, and they do not say it is aware of client rendering. Turn it on only after a page-level test.&lt;/p&gt;
&lt;h3 id=&quot;keep-the-claims-inside-the-sources&quot;&gt;Keep the claims inside the sources&lt;/h3&gt;
&lt;p&gt;SafeLine states that it is production-ready, that it protects over 1,000,000 websites, and that it handles over 30,000,000,000 HTTP requests daily (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price. Those figures help a budget conversation. They do not change the install floor, and they do not prove that a minimal 1 core and 1 GB host will carry your traffic. The deploy guide gives a minimum, not a capacity plan.&lt;/p&gt;
&lt;p&gt;I would also refuse three common overclaims. There is no documented command that installs SafeLine inside a Next.js repository. There is no documented connector for a hosted frontend platform that will not let you set an upstream. There is no documented promise that proxy filtering replaces authorization, output encoding, or dependency patching inside the app. The WAF can filter, monitor, and block malicious HTTP traffic, and the home page also says it prevents unauthorized data from leaving the app by applying policy. That is a proxy control. It is not a code review.&lt;/p&gt;
&lt;p&gt;If the checklist fails at upstream ownership or DNS placement, do not publish a protected label. A request that never passes through SafeLine is outside every feature named above.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-document-a-next-js-integration-&quot;&gt;Does SafeLine document a Next.js integration?&lt;/h4&gt;
&lt;p&gt;No. The install and application guides describe a reverse proxy and an application record. They do not document a Next.js package, config plugin, middleware hook, or server-action mode. If you cannot proxy the origin, this setup is the wrong fit.&lt;/p&gt;
&lt;h4 id=&quot;which-fields-matter-when-the-upstream-is-a-next-js-server-&quot;&gt;Which fields matter when the upstream is a Next.js server?&lt;/h4&gt;
&lt;p&gt;Domain, Port, and Upstream. Domain is the name clients use. Port is the SafeLine listen port, with SSL checked for HTTPS. Upstream is the real Next.js address. After saving, resolve that domain to the SafeLine server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&quot;what-should-i-test-on-the-first-day-&quot;&gt;What should I test on the first day?&lt;/h4&gt;
&lt;p&gt;Use the application guide sample cases for SQL injection, XSS, path traversal, code injection, and XXE, with your domain in place of the sample host. Expect the blocking page, then check the attack list and the detail view. Also send ordinary page, API, and form traffic so a policy problem is visible before users are.&lt;/p&gt;
&lt;h4 id=&quot;when-is-dynamic-protection-a-reasonable-option-&quot;&gt;When is dynamic protection a reasonable option?&lt;/h4&gt;
&lt;p&gt;When you want the documented behavior: HTML and JS encrypted dynamically on each visit. It is listed with the other main features, not as a Next.js switch (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Test real pages first. Do not treat it as a substitute for safe rendering in the app.&lt;/p&gt;
&lt;h4 id=&quot;what-host-and-license-facts-should-a-buyer-check-&quot;&gt;What host and license facts should a buyer check?&lt;/h4&gt;
&lt;p&gt;Linux, x86_64 or arm64, current Docker and Compose versions from the deploy guide, ssse3, and at least 1 core, 1 GB of memory, and 5 GB of disk. ARM needs a Pro license; the Personal Edition is not supported on ARM (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide, and SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32137/how-to-protect-a-next-js-app-when-no-framework-plugin-exists</guid>
<pubDate>Fri, 23 Oct 2026 04:01:56 +0000</pubDate>
</item>
<item>
<title>How to Decide If a Node.js App Belongs Behind SafeLine</title>
<link>https://coderlegion.com/32135/how-to-decide-if-a-node-js-app-belongs-behind-safeline</link>
<description>&lt;p&gt;A Node.js app is not protected by installing a library that these SafeLine documents never mention. The supplied pages describe a self-hosted web application firewall that filters and monitors HTTP traffic between a web application and the Internet. They do not document a Node module, an npm package, or framework middleware. The supported decision is whether the process can sit behind the documented reverse proxy. I will not invent a runtime agent to fill that gap.&lt;/p&gt;
&lt;p&gt;That boundary is the whole plan. Validation, sessions, and secrets stay in the application. SafeLine sits on the network path in front of it. Clients reach the WAF first. Only traffic it accepts should be forwarded to the Node process that still serves the original app.&lt;/p&gt;
&lt;h3 id=&quot;what-the-pages-actually-specify&quot;&gt;What the pages actually specify&lt;/h3&gt;
&lt;p&gt;The introduction says deploying a WAF in front of a web application places a shield between that application and the Internet. A forward proxy hides a client. SafeLine is the other shape: a reverse proxy that reduces direct exposure of the server, because clients pass through it before they reach the origin. It filters, monitors, and blocks malicious HTTP and HTTPS traffic, and it is also described as preventing unauthorized data from leaving the app by applying policies that separate malicious traffic from safe traffic. Listed core capabilities are defenses for web attacks, proactive bot abuse defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The application guide is the operational half of that statement. SafeLine is developed based on nginx. It receives traffic for the original website, cleans malicious attack traffic, and forwards safe and reliable traffic to the original application. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nothing on those pages ties the origin to one language. A Node HTTP server qualifies only as an upstream address. Express, Fastify, or the built-in http module do not receive a special connector in this material. The checklist is how I decide the proxy is appropriate, then how I fill only the fields the console documents.&lt;/p&gt;
&lt;h3 id=&quot;five-checks-before-dns-changes&quot;&gt;Five checks before DNS changes&lt;/h3&gt;
&lt;p&gt;Host fit is first. The deploy guide requires Linux, x86_64 or arm64, Docker 20.10.14 or above, and Docker Compose 2.0.0 or above. The minimum environment is 1 core CPU, 1 GB memory, and 5 GB disk. The CPU must support ssse3. The same page lists uname -m, docker version, docker compose version, free -h, df -h, and an lscpu check for ssse3 so the baseline can be confirmed before install. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Edition fit is second, and it matters on small Node hosts. SafeLine installed on ARM requires a Pro license to work properly. The Personal Edition is not supported on ARM. An arm64 image is therefore a license decision, not a footnote after the container starts. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Upstream design is third. Log into the web admin console, open Applications, and choose Add Application. Domain may be a domain name, a hostname, or an IP address. Port is what SafeLine listens on, such as 80 or 443. HTTPS applications need the SSL option checked. Upstream is the real address of the original app, and that is where cleaned traffic is forwarded. After the entry is saved, resolve the entered name to the IP of the server running SafeLine. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I do not publish the Node listen port as the client entry. If the upstream name resolves back to SafeLine, the forward path loops. The docs do not ship a Node bind tutorial, so the rule stays the documented one: upstream must be the real application address, reachable from the WAF.&lt;/p&gt;
&lt;p&gt;Proof is fourth. The application guide gives sample cases for SQL injection, XSS, path traversal, code injection, and XXE. Replace the example host with the protected domain. A blocking page means that case was defended. The web console attack list, then the detail view, shows whether the event was recorded. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Release track is fifth. The LTS version will no longer be maintained starting from 9.1.0-LTS (14 August 2025). LTS users are strongly recommended to upgrade to the latest version. If there are concerns, the deploy guide recommends waiting one month after a new release before upgrading. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;controls-that-match-a-public-node-service&quot;&gt;Controls that match a public Node service&lt;/h3&gt;
&lt;p&gt;Attack blocking is the wide net. The feature list names SQL injection, XSS, code injection, OS command injection, CRLF injection, XXE, SSRF, and path traversal. The introduction also names LDAP injection, XPath injection, RCE, backdoor, bruteforce, HTTP flood, and bot abuse. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rate limiting is documented against DoS attacks, bruteforce attempts, traffic surges, and other abuse, by throttling traffic that exceeds defined limits. IP-based rate limiting is part of the core list. A captcha challenge is documented so human users can continue while crawlers and bots are blocked. When the authentication challenge is on, visitors must enter the password or they are blocked. When dynamic protection is on, HTML and JS from the web server are dynamically encrypted on each visit. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I do not apply every control as if every Node app were a browser site. Dynamic HTML and JS encryption matches a page that returns markup. A JSON API should not be described as if that encryption were its main defense. For an API, the documented controls I plan around are attack filtering, rate limits, the bot challenge, and the access control list. The authentication challenge is a visitor password gate. It is not application login, and these pages do not say it replaces tokens or sessions inside Node.&lt;/p&gt;
&lt;p&gt;The home page also publishes an effect evaluation with 33669 samples in each column. SafeLine Balance is listed at 71.65 percent detection, 0.07 percent false positive, and 99.45 percent accuracy. SafeLine Strict is listed at 76.17 percent detection, 0.22 percent false positive, and 99.38 percent accuracy. The same table includes ModSecurity Level 1 and CloudFlare Free. I treat those cells as published comparison figures, not as a measurement I ran against a Node route. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;scale-and-commercial-notes-kept-apart-from-setup&quot;&gt;Scale and commercial notes, kept apart from setup&lt;/h3&gt;
&lt;p&gt;The introduction says SafeLine is production-ready. It reports over 180,000 installations worldwide, protection for over 1,000,000 websites, and more than 30,000,000,000 HTTP requests handled daily. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price. I keep those planning figures next to the older published installation count, and I do not let either number skip the proxy checks.&lt;/p&gt;
&lt;p&gt;Install steps stay inside the deploy guide. Automatic deploy runs the official manager script, then uses the web UI. Manual deploy creates a directory with at least 5 GB free, downloads compose.yaml, writes the .env file, generates the documented secrets, restricts permissions, and starts the stack with docker compose up -d. The initial admin account is printed by docker exec safeline-mgt resetadmin. The console is opened at &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt;. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I do not extend that into an unsupported Node story. These pages do not document WebSocket handling, gRPC mode, sticky sessions, or a process manager integration. If the app is ordinary HTTP or HTTPS, add the application, set domain, port, SSL, and upstream, and point DNS at SafeLine. If the traffic is not that, leave the claim unsupported instead of inventing a connector.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-document-a-node-js-plugin-&quot;&gt;Does SafeLine document a Node.js plugin?&lt;/h4&gt;
&lt;p&gt;No. The supplied home, deploy, and application pages describe a reverse proxy and console fields for domain, port, SSL, and upstream. They do not document an npm package or a Node agent. Protect the app by placing that proxy in front of the process.&lt;/p&gt;
&lt;h4 id=&quot;which-address-should-clients-use-&quot;&gt;Which address should clients use?&lt;/h4&gt;
&lt;p&gt;Clients should use the domain that resolves to the SafeLine server and the listen port on the application entry, such as 80 or 443. The Node address belongs in upstream. Leaving the Node port open on the public interface bypasses the shield described in the introduction.&lt;/p&gt;
&lt;h4 id=&quot;how-can-i-verify-a-block-without-guessing-&quot;&gt;How can I verify a block without guessing?&lt;/h4&gt;
&lt;p&gt;Use the documented SQL injection, XSS, path traversal, code injection, and XXE cases against your own domain. A blocking page is the expected sign that the case was stopped. Then open the console attack list and check detail for that event. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;when-does-architecture-force-a-pro-license-&quot;&gt;When does architecture force a Pro license?&lt;/h4&gt;
&lt;p&gt;When the install is ARM. The deploy guide says ARM requires a Pro license to work properly, and that the Personal Edition is not supported on ARM. Confirm uname -m before you treat a cheap arm64 host as ready. &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-should-stay-inside-the-node-process-&quot;&gt;What should stay inside the Node process?&lt;/h4&gt;
&lt;p&gt;Route validation, account authentication, and secret handling. SafeLine is documented to clean traffic and forward the safe portion to the original application. It does not take over application logic. Keep those checks even after the sample attacks show a blocking page.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32135/how-to-decide-if-a-node-js-app-belongs-behind-safeline</guid>
<pubDate>Fri, 23 Oct 2026 03:05:28 +0000</pubDate>
</item>
<item>
<title>How to Protect a Node.js App with a SafeLine Fit Checklist</title>
<link>https://coderlegion.com/32134/how-to-protect-a-node-js-app-with-a-safeline-fit-checklist</link>
<description>&lt;p&gt;Protecting a Node.js app with SafeLine starts as a fit decision, not as a search for an in-process library. The product documents describe SafeLine as a self-hosted web application firewall that filters and monitors HTTP traffic between a web application and the Internet. Clients pass through it before they reach the server. It is a reverse proxy, not a module loaded by your runtime (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The application guide says the same thing in operational language: SafeLine receives traffic for the original website, cleans malicious attack traffic, and forwards the safe remainder to the original application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Those pages do not document a Node.js SDK, Express middleware, Fastify plugin, or runtime agent. If that is what the keyword suggested, do not invent the integration. Keep Node as the upstream and decide whether the documented front door fits.&lt;/p&gt;
&lt;p&gt;The console model is small enough to checklist. You add an application with a domain, hostname, or IP, a listen port such as 80 or 443, the SSL option for an HTTPS app, and an upstream address. Upstream is the real address of the original app. For this keyword, that is the host and port the Node process already serves. After the application is saved, you resolve the domain to the SafeLine server so visitors reach the proxy first (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). A Node port that is still open on the public internet is a bypass. The checklist is not done until that bypass is closed.&lt;/p&gt;
&lt;p&gt;Confirm the protocol before you argue about frameworks. SafeLine is documented for HTTP and HTTPS web traffic. A Node process that only speaks some other protocol is outside this guide. Do not treat a reverse-proxy WAF as a generic socket filter just because the service happens to be written in JavaScript.&lt;/p&gt;
&lt;p&gt;Map risk to the published attack list. The home page names SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abused traffic (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Those classes matter when a Node route builds SQL, reflects input into HTML, shells out, parses XML, fetches a user-supplied URL, or reads a file path from a request. They do not retire bugs that never become a policy decision at the proxy, such as broken authorization inside a route or a secret committed to the repo. Say that limit out loud before the DNS cutover.&lt;/p&gt;
&lt;p&gt;Then pick only controls the docs name. Core capabilities are defenses for web attacks, proactive bot abused defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Rate limiting is described as throttling traffic that exceeds defined limits, aimed at DoS, brute force, traffic surges, and other abuse. CAPTCHA is described as allowing human users while blocking crawlers and bots. The authentication challenge blocks visitors who do not enter the password. Dynamic protection encrypts HTML and JS on each visit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A server-rendered Node site can use that HTML and JS control as documented. A JSON API should not be described as encrypted by it. For an API, the documented primary controls are attack blocking, rate limiting, and the access control list, with CAPTCHA or the password challenge only if you accept the visitor friction.&lt;/p&gt;
&lt;p&gt;Check the host against the deploy guide, not against your Node version. Requirements are Linux, x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, at least 1 CPU core, 1 GB of memory, and 5 GB of disk, plus a CPU with ssse3 (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). SafeLine installed on ARM requires a Pro license to work properly. The Personal Edition is not supported on ARM. The LTS version is no longer maintained starting from 9.1.0-LTS on 14 August 2025, and the guide strongly recommends the latest version. None of that is an npm constraint. Meeting it does not mean SafeLine inspects your package manifest.&lt;/p&gt;
&lt;p&gt;Prove blocking with the published cases, then read the console. The application guide lists SQL injection, XSS, path traversal, code injection, and XXE samples and tells you to replace the example domain with yours. A blocking page means the defense fired. The attack list and its detail view are how you confirm what was stopped (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Replay legitimate Node routes in the same pass. Encoded queries, file uploads, and webhook bodies can look hostile without being attacks against your app.&lt;/p&gt;
&lt;p&gt;Use the published evaluation as a comparison, not as your error budget. On 33,669 samples, the home page lists SafeLine Balance at 71.65% detection, 0.07% false positives, and 99.45% accuracy, and SafeLine Strict at 76.17% detection, 0.22% false positives, and 99.38% accuracy. The same table lists ModSecurity Level 1 at 69.74% detection, 17.58% false positives, and 82.20% accuracy, and CloudFlare Free at 10.70% detection, 0.07% false positives, and 98.40% accuracy (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Stage your own traffic anyway. Those rows do not mention your routes.&lt;/p&gt;
&lt;p&gt;As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price. Treat that range as a licensing input when you need Pro, including the ARM case in the deploy guide. Do not treat it as proof that every Node.js app needs that edition. The home page also calls SafeLine production-ready, protecting over 1,000,000 websites and handling over 30,000,000,000 HTTP requests daily (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Scale still does not replace an upstream health check. If the proxy cannot be reached, Node never sees the client. If Node is down, the proxy cannot write your application response for you.&lt;/p&gt;
&lt;p&gt;The console is &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt; unless the documented management port is changed, and the initial administrator account comes from docker exec safeline-mgt resetadmin (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). If you enable CAPTCHA or the password challenge, test them in a browser, because both change what happens before Node receives the request. The fit decision is complete only when clients use SafeLine, the Node upstream is private to that proxy path, attack probes show a blocking page and a console detail, and normal traffic still arrives.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-provide-a-node-js-integration-package-&quot;&gt;Does SafeLine provide a Node.js integration package?&lt;/h4&gt;
&lt;p&gt;The install guide and the application guide do not document an SDK, middleware, or runtime agent. The supported pattern is to add the Node process as the upstream and send clients to SafeLine first (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&quot;which-fields-define-the-node-upstream-&quot;&gt;Which fields define the Node upstream?&lt;/h4&gt;
&lt;p&gt;The documented fields are domain, port, the SSL option for HTTPS, and upstream. Upstream is the real address of the original app, meaning the host and port your Node process already serves (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&quot;will-dynamic-protection-encrypt-json-api-responses-&quot;&gt;Will dynamic protection encrypt JSON API responses?&lt;/h4&gt;
&lt;p&gt;Dynamic protection is documented as encrypting HTML and JS on each visit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Judge a JSON API on attack blocking, IP-based rate limiting, the web access control list, and, if you accept the extra step, CAPTCHA or the authentication challenge.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-confirm-a-probe-was-stopped-by-safeline-&quot;&gt;How do I confirm a probe was stopped by SafeLine?&lt;/h4&gt;
&lt;p&gt;Run the published SQL injection, XSS, path traversal, code injection, and XXE cases against your domain. A blocking page plus an attack-list detail in the console is the documented confirmation (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id=&quot;when-does-pro-pricing-matter-for-this-setup-&quot;&gt;When does Pro pricing matter for this setup?&lt;/h4&gt;
&lt;p&gt;ARM installs require a Pro license, and the Personal Edition is not supported on ARM (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). As of September 30, 2026, SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price. That is a license input, not a claim that every x86_64 Node deployment must be Pro.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32134/how-to-protect-a-node-js-app-with-a-safeline-fit-checklist</guid>
<pubDate>Fri, 23 Oct 2026 03:04:56 +0000</pubDate>
</item>
<item>
<title>How to Protect a Laravel App with a WAF Using a Placement Checklist</title>
<link>https://coderlegion.com/32042/how-to-protect-a-laravel-app-with-a-waf-using-a-placement-checklist</link>
<description>&lt;p&gt;If you are looking up how to protect a Laravel app with a WAF, split the job before you change DNS. Laravel already owns validation, CSRF, authentication middleware, and authorization. A WAF owns the HTTP path in front of that code. The SafeLine documents used here do not describe a Laravel package, a PHP extension, or a framework connector. This is a go or no-go placement checklist: where the proxy sits, what you leave inside the framework, and which documented controls you enable only after staging. It is not a native integration guide.&lt;/p&gt;
&lt;h3 id=&quot;what-the-sources-actually-support&quot;&gt;What the sources actually support&lt;/h3&gt;
&lt;p&gt;SafeLine is a self-hosted WAF that protects web apps by filtering and monitoring HTTP traffic between a web application and the Internet. The product overview describes it as a reverse proxy. Clients pass through the WAF before they reach the server. It filters, monitors, and blocks malicious HTTP and HTTPS traffic, and it uses policies to decide what is malicious and what is safe. The same page says this is also meant to prevent unauthorized data from leaving the app. The application guide states that SafeLine is developed based on nginx, receives traffic for the original website, cleans malicious attack traffic, and forwards safe and reliable traffic to the original application. Those statements are general. They can cover a Laravel app because Laravel is served over HTTP, not because a Laravel mode is documented. Product overview: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;. Application proxy guide: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;proxy-record-dns-and-upstream&quot;&gt;Proxy record, DNS, and upstream&lt;/h3&gt;
&lt;p&gt;Confirm public names, ports, and the real app address before you cut over. In the SafeLine web console, the documented flow is to open Applications and add an application. Enter the domain, hostname, or IP of the original app. Enter the port SafeLine will listen on, such as 80 or 443, and check the SSL option for HTTPS apps. Enter the upstream, which is the real address SafeLine will use to forward traffic. Then resolve that domain to the IP of the server where SafeLine runs. If the name still points at the Laravel host, the WAF is not on the request path and none of its policies can act.&lt;/p&gt;
&lt;p&gt;Keep the console and the application listener separate. The deploy guide uses a management port, with 9443 as the console example at &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt;, while the application guide uses the site port such as 80 or 443. Pointing public app DNS at the console port is not the documented way to protect the site.&lt;/p&gt;
&lt;h3 id=&quot;what-stays-inside-laravel&quot;&gt;What stays inside Laravel&lt;/h3&gt;
&lt;p&gt;Form requests, policies, signed URLs, sessions, and CSRF stay in the framework. A reverse proxy does not replace them. What the overview lists as attack coverage includes SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abused, among others. Core capabilities on that page are defenses for web attacks, proactive bot abused defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list.&lt;/p&gt;
&lt;p&gt;Map those capabilities to routes only after a staging pass, and do not invent Laravel-specific rules that the sources do not publish. Rate limiting is documented as throttling traffic that exceeds defined limits, to defend against DoS attacks, brute-force attempts, traffic surges, and other abuse. That can matter for login and password-reset routes, but nothing here says the limiter reads Laravel throttle configuration. Captcha challenge is documented to allow human users and to block crawlers and bots. Authentication challenge, when turned on, requires visitors to enter a password, otherwise they are blocked. Dynamic protection, when turned on, dynamically encrypts HTML and JS on each visit. Test Blade responses, front-end assets, JSON API calls, uploads, and inbound webhooks before you enable those options on production. A web access control list is listed, but these sources do not publish a Laravel webhook exception recipe, so test callbacks instead of assuming an allow entry.&lt;/p&gt;
&lt;h3 id=&quot;host-floor-and-proof&quot;&gt;Host floor and proof&lt;/h3&gt;
&lt;p&gt;Check the host against the deploy guide before cutover: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;. Requirements are Linux, x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, and at least 1 CPU core, 1 GB of memory, and 5 GB of disk. The CPU must support SSSE3. The guide states that SafeLine installed on ARM requires a Pro license to work properly and that the Personal Edition is not supported on ARM. It also states that the LTS version will no longer be maintained starting from 9.1.0-LTS on 14 August 2025, and it strongly recommends upgrading to the latest version. Those are infrastructure facts, not Laravel facts. A proxy you cannot run is not protection.&lt;/p&gt;
&lt;p&gt;Prove the path with the tests the application guide already publishes. The sample cases cover SQL injection, XSS, path traversal, code injection, and XXE. Replace the sample host with your staging domain. A blocking page means SafeLine defended that request. Then open the console attack list and click detail. Also send ordinary traffic your app expects: a login, a form post, a static file, and a JSON call. HTTPS apps need the SSL option on the SafeLine listener. How Laravel records the client IP after an extra proxy hop is your application configuration. These sources do not document a Laravel trusted-proxy setting, so do not treat that as a SafeLine feature. If the origin remains reachable on a public address, clients can skip the proxy. Restrict that direct path only after the proxied staging path is proven.&lt;/p&gt;
&lt;p&gt;The product page says SafeLine is production-ready, protecting over 1,000,000 websites and handling over 30,000,000,000 HTTP requests daily. Its published evaluation uses 33,669 samples and lists SafeLine Balance at 71.65 percent detection, 0.07 percent false positive, and 99.45 percent accuracy, and SafeLine Strict at 76.17 percent detection, 0.22 percent false positive, and 99.38 percent accuracy. Use those figures as published results from &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;, not as a guarantee for your routes.&lt;/p&gt;
&lt;h3 id=&quot;faq-1&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;does-safeline-ship-a-laravel-package-&quot;&gt;Does SafeLine ship a Laravel package?&lt;/h4&gt;
&lt;p&gt;No. The install guide and the application guide describe a reverse proxy and a generic application record with domain, port, and upstream. They do not document an artisan command, a service provider, or a PHP extension. Protection means public traffic reaches SafeLine first and SafeLine forwards cleaned traffic to the Laravel upstream.&lt;/p&gt;
&lt;h4 id=&quot;which-attack-classes-can-i-cite-from-the-docs-&quot;&gt;Which attack classes can I cite from the docs?&lt;/h4&gt;
&lt;p&gt;The overview names SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abused, among others. Replay real application requests as well. A detection list is not a passing test suite for your routes.&lt;/p&gt;
&lt;h4 id=&quot;will-ip-rate-limiting-replace-laravel-auth-&quot;&gt;Will IP rate limiting replace Laravel auth?&lt;/h4&gt;
&lt;p&gt;No. Rate limiting throttles traffic that exceeds defined limits and is described as a defense against DoS attacks, brute-force attempts, traffic surges, and other abuse. Login checks, authorization, and CSRF remain in Laravel. Captcha challenge and authentication challenge are separate documented options. Authentication challenge blocks visitors who do not enter the password.&lt;/p&gt;
&lt;h4 id=&quot;what-fails-the-host-checklist-&quot;&gt;What fails the host checklist?&lt;/h4&gt;
&lt;p&gt;A non-Linux host, an architecture other than x86_64 or arm64, Docker or Docker Compose below the stated versions, less than 1 GB of memory or 5 GB of disk, or a CPU without SSSE3. On ARM, the deploy guide requires a Pro license and states that the Personal Edition is not supported. An x86_64 trial does not prove an ARM host is licensed.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-know-the-waf-is-actually-in-front-&quot;&gt;How do I know the WAF is actually in front?&lt;/h4&gt;
&lt;p&gt;The application domain must resolve to the SafeLine server. Documented attack samples against that domain should show the blocking page, and the console attack detail should record them. Normal logins, form posts, assets, and JSON calls should still succeed. If the Laravel origin is still open on a public address, the proxy can be bypassed.&lt;/p&gt;
&lt;p&gt;As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price.&lt;/p&gt;
&lt;p&gt;You are invited to inspect the project, read the deployment and application guides, and review the promotion before any production DNS change. Stand up a staging hostname, run the published probes, and keep Laravel validation and auth in place while you judge the proxy.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32042/how-to-protect-a-laravel-app-with-a-waf-using-a-placement-checklist</guid>
<pubDate>Thu, 22 Oct 2026 08:02:04 +0000</pubDate>
</item>
<item>
<title>How to Protect a Laravel App with a WAF Cutover Checklist</title>
<link>https://coderlegion.com/32041/how-to-protect-a-laravel-app-with-a-waf-cutover-checklist</link>
<description>&lt;p&gt;A Laravel app does not become protected just because a firewall product exists. The useful question is where the control sits, what traffic it can see, and how you prove the origin still works after the cutover. This guide is a decision checklist for that cutover. It does not promise a Laravel plugin, because the official SafeLine documents do not describe one.&lt;/p&gt;
&lt;p&gt;SafeLine is a self-hosted web application firewall. The home documentation says it protects web apps by filtering and monitoring HTTP traffic between a web application and the Internet, and that a WAF placed in front of an application acts as a reverse-proxy shield: clients pass through the WAF before they reach the server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The application guide adds that SafeLine is developed based on nginx, receives traffic for the original website, cleans malicious attack traffic, and forwards safe traffic to the original application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). That is the supported way to put it in front of Laravel. Point the proxy at the existing upstream. Do not look for a framework installer that those pages do not provide.&lt;/p&gt;
&lt;h3 id=&quot;what-belongs-in-the-checklist&quot;&gt;What belongs in the checklist&lt;/h3&gt;
&lt;p&gt;Start with the attacks you actually want filtered at the edge. The home page lists SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor activity, brute force, HTTP flood, and bot abuse. Laravel routes that read query strings, form bodies, file paths, XML, or user-supplied URLs can meet several of those classes. Keep parameterized queries, authorization, and output encoding in the application. The outer filter does not retire them.&lt;/p&gt;
&lt;p&gt;Next, choose controls that the product actually documents. Core capabilities on the home page are defenses for web attacks, proactive bot-abuse defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list. The feature list also describes rate limiting for denial-of-service patterns, brute-force attempts, traffic surges, and other abuse; CAPTCHA challenges that allow human users while blocking crawlers and bots; an authentication challenge that requires a password or blocks the visitor; and dynamic protection that encrypts HTML and JS on each visit (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). For a public Laravel site, web-attack blocking and rate limiting are the usual first pass. A password challenge can lock out customers. Dynamic encryption can interact badly with front-end assets, so test it on a copy of the site before you treat it as required.&lt;/p&gt;
&lt;p&gt;Then check the machine, not the framework. The install guide requires Linux, x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, SSSE3, and a minimum of 1 CPU core, 1 GB of memory, and 5 GB of disk (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). The same guide states that SafeLine on ARM requires a Pro license and that the Personal Edition is not supported on ARM. It also states that the LTS version will no longer be maintained starting from 9.1.0-LTS (14 August 2025), and it strongly recommends that LTS users upgrade to the latest version. If your Laravel host fails any of those checks, fix the host before you edit DNS.&lt;/p&gt;
&lt;h3 id=&quot;how-the-proxy-record-should-look&quot;&gt;How the proxy record should look&lt;/h3&gt;
&lt;p&gt;Log into the web console, open Applications, and add an application. The documented fields are domain, port, and upstream. Domain can be a domain name, hostname, or IP address. Port is what SafeLine listens on, such as 80 or 443. For HTTPS apps, check the SSL option. Upstream is the real address of the original app, and SafeLine forwards traffic there (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). After saving, resolve that domain to the SafeLine server. The Laravel process should remain the upstream, not a second copy of the WAF.&lt;/p&gt;
&lt;p&gt;The console itself is separate from the site you are protecting. After installation, the guide says to open &lt;a rel=&quot;nofollow&quot; href=&quot;https://&amp;lt;safeline-ip&amp;gt;:9443/&quot;&gt;https://&amp;lt;safeline-ip&amp;gt;:9443/&lt;/a&gt; and to obtain the initial administrator account with &lt;code&gt;docker exec safeline-mgt resetadmin&lt;/code&gt; (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). Store that password outside the Laravel repository. Automated install is documented as a root-level command, and manual install writes configuration under a directory such as /data/safeline with at least 5 GB free. Those are deployment facts, not Laravel settings.&lt;/p&gt;
&lt;h3 id=&quot;what-to-test-before-you-call-it-protected&quot;&gt;What to test before you call it protected&lt;/h3&gt;
&lt;p&gt;The application guide publishes probe URLs for SQL injection, XSS, path traversal, code injection, and XXE, and tells you to replace the example domain with your own. A blocking page means the defense stopped that request. Open the console attack list and click detail to confirm the event was recorded (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Run those probes only against an application you are allowed to test.&lt;/p&gt;
&lt;p&gt;Then test the traffic you intend to allow. Submit a real login, a validation failure, a form that your users already use, and an API call that should succeed. A WAF that blocks a union-select probe but also blocks a legitimate POST is not finished. The documents do not publish a Laravel route map, so you have to supply that test list yourself.&lt;/p&gt;
&lt;p&gt;Read published evaluation numbers as published numbers, then repeat the check on your own app. On 33,669 samples, the home page reports SafeLine Balance at 71.65 percent detection, 0.07 percent false positives, and 99.45 percent accuracy, and SafeLine Strict at 76.17 percent detection, 0.22 percent false positives, and 99.38 percent accuracy (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The same section says SafeLine is production-ready, with over 180,000 installations worldwide, protecting over 1,000,000 websites and handling over 30,000,000,000 HTTP requests daily. As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price. Neither the sample table nor the price range replaces a cutover test on your Laravel upstream.&lt;/p&gt;
&lt;p&gt;If you later remove the proxy, the install guide says to enter the SafeLine directory, run &lt;code&gt;docker compose down&lt;/code&gt;, and remove that directory only when you are sure you no longer want the data (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). Do that only after DNS no longer points clients at a stopped proxy.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-include-a-laravel-plugin-or-middleware-&quot;&gt;Does SafeLine include a Laravel plugin or middleware?&lt;/h4&gt;
&lt;p&gt;No. The install and application documents describe a reverse proxy, a console, and an application record with domain, port, and upstream. They do not document a Laravel package. Protection means proxying the existing app, not importing a framework module.&lt;/p&gt;
&lt;h4 id=&quot;can-application-validation-be-removed-after-the-waf-is-live-&quot;&gt;Can application validation be removed after the WAF is live?&lt;/h4&gt;
&lt;p&gt;No. SafeLine filters and monitors HTTP traffic before the origin sees it. Laravel still needs authorization, validation, and safe database access. Treat the WAF as an outer layer in the checklist, not as a replacement for application controls.&lt;/p&gt;
&lt;h4 id=&quot;which-documented-controls-should-i-enable-first-&quot;&gt;Which documented controls should I enable first?&lt;/h4&gt;
&lt;p&gt;Use documented web-attack defenses first, and consider IP-based rate limiting if brute force, HTTP floods, or traffic surges are in scope. Add a CAPTCHA challenge when bot abuse is a real problem. Test the authentication challenge and HTML or JS dynamic protection before enabling them on a public Laravel site, because a password wall or encrypted page output can break ordinary visitors.&lt;/p&gt;
&lt;h4 id=&quot;what-proves-the-cutover-worked-&quot;&gt;What proves the cutover worked?&lt;/h4&gt;
&lt;p&gt;Legitimate users and API clients still reach the upstream, HTTPS works if you checked the SSL option, and the documented attack probes against your own domain produce a block page that appears in the attack detail view. DNS should point at the SafeLine server only after those checks pass.&lt;/p&gt;
&lt;h4 id=&quot;is-the-minimum-server-size-enough-for-every-laravel-app-&quot;&gt;Is the minimum server size enough for every Laravel app?&lt;/h4&gt;
&lt;p&gt;The documented minimum is 1 core, 1 GB of memory, and 5 GB of disk, with Docker and SSSE3. That is a floor for installation, not a capacity guarantee. On ARM, the install guide says a Pro license is required and the Personal Edition is not supported.&lt;/p&gt;
&lt;p&gt;If this checklist matches the way you want to protect the app, read the project and the official docs, then rehearse the proxy on a non-production name before you move real users. You are invited to compare the documented controls with your own routes and to keep the upstream test list next to the change. Official project: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt; Official documentation: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt; Install guide: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt; Application guide: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt; Promotion: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32041/how-to-protect-a-laravel-app-with-a-waf-cutover-checklist</guid>
<pubDate>Thu, 22 Oct 2026 08:01:33 +0000</pubDate>
</item>
<item>
<title>How to Decide Whether a WAF Can Protect a GraphQL API</title>
<link>https://coderlegion.com/32040/how-to-decide-whether-a-waf-can-protect-a-graphql-api</link>
<description>&lt;p&gt;Protecting a GraphQL API with a WAF starts with an honest inventory of the HTTP conversation, not with a claim that the firewall understands your schema. SafeLine is a self-hosted web application firewall that filters and monitors HTTP traffic between a web application and the Internet, and it works as a reverse proxy so clients reach the shield before they reach the origin (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The same product docs describe it as an HTTP and HTTPS reverse proxy built on nginx: it receives traffic for the original site, cleans malicious traffic, and forwards the remaining traffic upstream (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Those pages do not describe a GraphQL parser, query-depth limit, complexity budget, or persisted-query allowlist. This checklist is the decision guide I use when the question is how to protect a GraphQL API with a WAF and the product evidence only covers general HTTP controls.&lt;/p&gt;
&lt;p&gt;Start with the listener, not the resolvers. In the SafeLine console, an application is defined by a domain, hostname, or IP, a listen port such as 80 or 443, an SSL option for HTTPS apps, and an upstream address that receives forwarded traffic (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). After that, the domain must resolve to the SafeLine server. For GraphQL, write down the exact path, methods, and content types your clients use. A browser app that posts JSON to a single endpoint is a different operational problem from a partner integration that posts the same shape from a server. Both are still HTTP. Neither fact, by itself, means SafeLine will interpret operation names.&lt;/p&gt;
&lt;p&gt;Separate controls that belong in the API from controls the WAF documents. Field authorization, introspection policy, alias limits, depth limits, and cost analysis have to live in the GraphQL server or gateway. Do not treat a missing integration note as a hidden feature. What the WAF docs do list is broader web-attack defense, proactive bot-abuse defense, HTML and JS code encryption, IP-based rate limiting, and a web access control list (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). The attack list includes SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoor, brute force, HTTP flood, and bot abuse. Those checks can matter when a GraphQL variable carries a classic payload, because the bytes still travel in an HTTP request. They are not a substitute for resolver authorization, and they do not prove that every malicious query will be recognized as GraphQL abuse.&lt;/p&gt;
&lt;p&gt;Use rate limiting where the abuse is volume, not query shape. SafeLine rate limiting is documented as a way to throttle traffic that exceeds defined limits, including DoS, brute-force attempts, traffic surges, and other abuse (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). That is a reasonable layer in front of a login mutation or a hot query path that is being flooded. It does not count field complexity. If one small request can expand into thousands of resolver calls, fix that in the API even if the firewall never raises an alarm.&lt;/p&gt;
&lt;p&gt;Be careful with challenges. CAPTCHA is documented to allow human users and block crawlers and bots. An authentication challenge, when turned on, requires visitors to enter a password or be blocked (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Those controls can fit a browser-only GraphQL console. They can break mobile apps, server jobs, and other non-browser clients. Put that client inventory on the checklist before you enable either challenge on the API host. Dynamic protection, which encrypts HTML and JS on each visit, is also documented (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A pure JSON GraphQL response is not an HTML or JS page, so do not plan on that feature as API protection.&lt;/p&gt;
&lt;p&gt;Validate with the tests the docs actually publish, then read the console. The application guide shows sample requests for SQL injection, XSS, path traversal, code injection, and XXE, and says a blocking page means the attack was defended. Attack detail is available in the web console (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). You can repeat the same payload classes inside a GraphQL variable as a manual check that the HTTP body is visible to inspection. A block is evidence about that payload, not evidence of schema-aware coverage. A pass is not proof that the query is safe.&lt;/p&gt;
&lt;p&gt;Check the host before cutover. The install guide requires Linux, x86_64 or arm64, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, and at least 1 CPU core, 1 GB of memory, and 5 GB of disk, plus a CPU with ssse3 (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). The same page says SafeLine on ARM requires a Pro license and that the Personal Edition is not supported on ARM. The product home page states that SafeLine is production-ready, with over 180,000 installations, protection for over 1,000,000 websites, and more than 30,000,000,000 HTTP requests handled daily (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price.&lt;/p&gt;
&lt;p&gt;If the checklist fails at any point where you needed a GraphQL-specific control, keep that control in the API. Use the WAF for the HTTP jobs its docs describe: reverse-proxy placement, attack filtering, rate limiting, access control, and optional human challenges on browser traffic.&lt;/p&gt;
&lt;h4 id=&quot;does-safeline-document-a-graphql-rule-pack-&quot;&gt;Does SafeLine document a GraphQL rule pack?&lt;/h4&gt;
&lt;p&gt;No. The supplied product docs describe general HTTP and HTTPS filtering, reverse-proxy application setup, and the controls listed above. They do not document GraphQL query parsing, depth limits, or complexity scoring. Plan those in the API.&lt;/p&gt;
&lt;h4 id=&quot;should-every-graphql-client-pass-a-captcha-&quot;&gt;Should every GraphQL client pass a CAPTCHA?&lt;/h4&gt;
&lt;p&gt;No. CAPTCHA and the authentication challenge are documented visitor checks. They fit some browser flows and can block legitimate non-browser clients. Decide from your client list, not from a generic API template.&lt;/p&gt;
&lt;h4 id=&quot;is-ip-rate-limiting-enough-for-an-expensive-query-&quot;&gt;Is IP rate limiting enough for an expensive query?&lt;/h4&gt;
&lt;p&gt;No. Documented rate limiting throttles traffic that exceeds defined limits. It does not measure resolver cost. Keep complexity limits in the GraphQL server, and use rate limiting for floods and brute force.&lt;/p&gt;
&lt;h4 id=&quot;what-do-i-check-after-the-domain-points-at-safeline-&quot;&gt;What do I check after the domain points at SafeLine?&lt;/h4&gt;
&lt;p&gt;Confirm domain, port, SSL choice, and upstream in the application dialog, then confirm clients still reach the origin only through the proxy (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Review the attack list when you replay the documented test payloads. Treat GraphQL-only abuse cases as API tests, not as undocumented firewall features.&lt;/p&gt;
&lt;p&gt;If you want a second pair of eyes on this checklist before cutover, review the project and the official docs, then compare the current Pro promotion with your deployment constraints.&lt;/p&gt;
&lt;p&gt;Project: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;br&gt;
Docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;br&gt;
Promotion: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32040/how-to-decide-whether-a-waf-can-protect-a-graphql-api</guid>
<pubDate>Thu, 22 Oct 2026 08:00:23 +0000</pubDate>
</item>
<item>
<title>How to Decide If a WAF Belongs in Front of GraphQL</title>
<link>https://coderlegion.com/32039/how-to-decide-if-a-waf-belongs-in-front-of-graphql</link>
<description>&lt;p&gt;A GraphQL API is still an HTTP application with a narrow front door. Most deployments expose one path, accept a document plus variables, and return JSON. That shape invites two mistakes: leaving the origin directly reachable, or assuming a web application firewall understands selections, fragments, and resolver cost. This checklist uses only controls described in the SafeLine documentation. Where those pages are silent, the item stays on the API, not in the proxy.&lt;/p&gt;
&lt;p&gt;SafeLine is a self-hosted WAF. It filters and monitors HTTP traffic and is designed to block common web attacks, including SQL injection, XSS, code injection, OS command injection, CRLF injection, LDAP injection, XPath injection, RCE, XXE, SSRF, path traversal, backdoors, brute force, HTTP flood, and bot abuse (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). It works as a reverse proxy: clients pass through it before they reach the server, and it forwards traffic it does not treat as malicious (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;). Nothing on those pages describes a GraphQL parser, an introspection switch, a complexity score, or a persisted-query catalog. If you need those, build them in the GraphQL server. A WAF placement is still worth a decision, because the same endpoint is ordinary HTTP and can carry injection payloads in headers, query strings, and bodies.&lt;/p&gt;
&lt;h3 id=&quot;placement-checklist-1&quot;&gt;Placement checklist&lt;/h3&gt;
&lt;p&gt;Work through these gates before you change a production record.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Confirm the protocol. SafeLine protects web apps by proxying HTTP and HTTPS. If the API is not reached that way, stop. Do not invent a side integration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pick the hostname clients already trust. In Applications, Add Application asks for Domain, Port, and Upstream. Use 443 and enable SSL for HTTPS, or 80 for plain HTTP. Upstream is the real address of the GraphQL process. After saving, resolve that domain to the SafeLine server so clients never need the origin address (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Map each fear to a documented control. Injection and related web attacks map to the attack defenses above. Floods, brute force, and traffic surges map to rate limiting, which the docs describe as throttling traffic that exceeds defined limits, and the core list calls out IP-based rate limiting (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). A web access control list is also named there. Do not write rule syntax the guides do not provide; configure it in the console and verify the result.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Treat human challenges as optional, not as API authentication. Captcha is documented to allow human users and block crawlers and bots. Authentication challenge blocks visitors who do not enter the password. Either can shield a browser IDE pointed at &lt;code&gt;/graphql&lt;/code&gt;. Either can also black-hole a mobile client or a partner job. If no human is in the loop, leave both off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Skip dynamic HTML and JS encryption for a JSON API. That feature encrypts HTML and JS on each visit. It is not a control for GraphQL documents or JSON responses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Match the host to the install guide before the pilot. You need Linux on x86_64 or arm64, Docker 20.10.14 or newer, Docker Compose 2.0.0 or newer, at least one CPU core, 1 GB of memory, 5 GB of disk, and a CPU with SSSE3 (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;https://docs.waf.chaitin.com/en/GetStarted/Deploy&lt;/a&gt;). On ARM, a Pro license is required; the Personal Edition is not supported on ARM. The same page notes that the LTS line is no longer maintained starting from 9.1.0-LTS on 14 August 2025, and recommends the current release for new setups.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prove the path with the published probes, then with your own POST. The application guide lists SQL injection, XSS, path traversal, code injection, and XXE samples as query strings, and tells you to expect a block page and to open the attack detail in the console. Run those against a test hostname. Then send a normal GraphQL query, a mutation, and a deliberately hostile string inside a variable. A query-string block does not, by itself, prove how a JSON body will be classified. The console is the evidence, not a guess.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep schema policy at the origin. Depth limits, alias and batch ceilings, field authorization, and introspection policy are application concerns. SafeLine is not documented as a GraphQL gateway. Putting it in front does not authorize you to delete those checks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Rate limits need a GraphQL-specific reading even though the feature is generic. One route receives almost every operation, so a low ceiling can punish a busy office NAT or a single backend egress address. Start from real client-IP rates, then tighten. Review the attack list after the change so a false block is visible before customers report it.&lt;/p&gt;
&lt;p&gt;The home documentation calls the product production-ready, protecting over 1,000,000 websites and handling over 30,000,000,000 HTTP requests daily, and it publishes a general detection evaluation on 33,669 samples (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;). Those numbers are not a GraphQL score. Do not reuse them as one. As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price.&lt;/p&gt;
&lt;h4 id=&quot;does-the-documentation-describe-graphql-body-parsing-&quot;&gt;Does the documentation describe GraphQL body parsing?&lt;/h4&gt;
&lt;p&gt;No. It describes HTTP and HTTPS reverse-proxy filtering and a list of web-attack defenses. Plan for that, and test a real POST, instead of assuming a schema-aware inspection engine.&lt;/p&gt;
&lt;h4 id=&quot;where-do-clients-send-graphql-after-cutover-&quot;&gt;Where do clients send GraphQL after cutover?&lt;/h4&gt;
&lt;p&gt;They send it to the domain you added in Applications. That domain must resolve to the SafeLine host. SafeLine forwards cleaned traffic to the upstream you configured.&lt;/p&gt;
&lt;h4 id=&quot;can-captcha-replace-api-keys-&quot;&gt;Can captcha replace API keys?&lt;/h4&gt;
&lt;p&gt;No. Captcha and the authentication challenge are visitor gates for humans and bots, as documented. Credential checks for apps, jobs, and partners still belong to your API.&lt;/p&gt;
&lt;h4 id=&quot;what-fails-an-install-before-graphql-is-even-involved-&quot;&gt;What fails an install before GraphQL is even involved?&lt;/h4&gt;
&lt;p&gt;A host that misses the Docker, Compose, CPU, memory, disk, or SSSE3 requirements will not match the install guide. An ARM host without a Pro license is also the wrong pilot target, because the Personal Edition is not supported on ARM.&lt;/p&gt;
&lt;h4 id=&quot;what-should-the-first-success-metric-be-&quot;&gt;What should the first success metric be?&lt;/h4&gt;
&lt;p&gt;A documented attack sample blocked on a test hostname, a visible detail record in the console, and a legitimate GraphQL operation from a real client that still succeeds. Adoption of the proxy is not proof that resolver cost is under control.&lt;/p&gt;
&lt;p&gt;If you are about to publish a GraphQL endpoint, walk this checklist, install from the official guide, and add the application before you argue about schema limits. As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price. You can review the project, the docs, and the current promotion here:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32039/how-to-decide-if-a-waf-belongs-in-front-of-graphql</guid>
<pubDate>Thu, 22 Oct 2026 07:59:52 +0000</pubDate>
</item>
<item>
<title>How to Protect a Microservices Architecture with a WAF: A Practical SafeLine Checklist</title>
<link>https://coderlegion.com/31920/how-to-protect-a-microservices-architecture-with-a-waf-a-practical-safeline-checklist</link>
<description>&lt;p&gt;Microservices improve deployment flexibility, but they also create a larger HTTP attack surface. Public APIs, authentication services, administration panels, checkout endpoints, and internal services exposed through an ingress layer may all receive traffic from the Internet. A web application firewall can provide a control point before requests reach those services, while service owners continue to manage application authentication, authorization, validation, and business logic.&lt;/p&gt;
&lt;p&gt;SafeLine works as an HTTP/HTTPS reverse proxy. It receives traffic for the original application, filters malicious requests, and forwards safe traffic to the upstream service. The official application guide describes this model and explains that an application can be added by configuring its domain, listening port, and upstream address: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;SafeLine Add Application Guide&lt;/a&gt;. For a microservices environment, the practical question is where to place that proxy boundary.&lt;/p&gt;
&lt;p&gt;A useful starting design is to place SafeLine at the public edge for Internet-facing domains. Route each protected hostname to the SafeLine server, then configure the corresponding upstream service or gateway. Keep the upstream services reachable from the proxy while limiting direct public access through the surrounding network controls. This makes the request path easy to reason about: client, SafeLine, ingress or service endpoint, and application.&lt;/p&gt;
&lt;p&gt;Use a separate application entry when services have different hostnames, ports, TLS requirements, or traffic policies. Begin with the services that handle sensitive data or accept unauthenticated traffic. Record the expected methods, paths, request sizes, and client patterns for each service before changing policy. This helps teams investigate a blocked request without treating every microservice as if it had identical traffic.&lt;/p&gt;
&lt;p&gt;SafeLine documentation lists defenses for attacks including SQL injection, XSS, code injection, OS command injection, CRLF injection, XXE, SSRF, path traversal, and related web attacks. It also documents rate limiting, CAPTCHA challenges, authentication challenges, dynamic protection for HTML and JavaScript, and access controls: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;SafeLine Home and Features&lt;/a&gt;. Apply these controls according to endpoint behavior. Rate limits can be relevant to login and password reset paths, while a CAPTCHA challenge may suit selected public forms. Avoid applying a challenge blindly to machine-to-machine APIs without testing the client workflow.&lt;/p&gt;
&lt;p&gt;For operations, define ownership for the proxy configuration, upstream health checks, incident review, and rollback. Keep a record of each hostname and its upstream target. Test expected requests as well as representative attack cases in a controlled environment. The application guide shows examples for SQL injection, XSS, path traversal, code injection, and XXE, and explains how to review attack details in the web console. Treat those examples as validation inputs for an authorized test environment, not as a substitute for application security testing.&lt;/p&gt;
&lt;p&gt;Deployment should match the supported environment. The installation guide lists Linux, x86_64 and arm64 instruction architectures, Docker 20.10.14 or above, Docker Compose 2.0.0 or above, and a minimum environment of one CPU core, 1 GB memory, and 5 GB disk: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;SafeLine Deploy Guide&lt;/a&gt;. Plan capacity around actual traffic and logging needs, and verify architecture specific requirements before deployment. The guide states that ARM installation requires a Pro license and that the Personal Edition is not supported on ARM.&lt;/p&gt;
&lt;p&gt;As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price. Confirm the applicable offer and deployment requirements through the official project materials before making a purchase or architecture decision.&lt;/p&gt;
&lt;h4 id=&quot;should-safeline-protect-every-microservice-&quot;&gt;Should SafeLine protect every microservice?&lt;/h4&gt;
&lt;p&gt;Start with Internet-facing services and shared entry points. A WAF is most useful where HTTP or HTTPS traffic crosses a trust boundary. Internal services may still need authentication, authorization, input validation, and network segmentation even when traffic passes through a protected gateway.&lt;/p&gt;
&lt;h4 id=&quot;how-should-upstream-routing-be-organized-&quot;&gt;How should upstream routing be organized?&lt;/h4&gt;
&lt;p&gt;Map each public domain to the intended upstream address and port, then verify DNS points to the SafeLine server. Keep a service inventory with owners, expected traffic, TLS settings, and rollback details. The official guide describes the domain, port, SSL option, and upstream fields used when adding an application.&lt;/p&gt;
&lt;h4 id=&quot;can-a-waf-replace-microservice-security-controls-&quot;&gt;Can a WAF replace microservice security controls?&lt;/h4&gt;
&lt;p&gt;No. SafeLine can filter and monitor HTTP traffic, but it does not replace identity controls, authorization checks, secure coding, secrets management, dependency updates, or service level logging. Use it as one enforcement layer in a broader architecture.&lt;/p&gt;
&lt;h4 id=&quot;what-should-be-tested-after-onboarding-a-service-&quot;&gt;What should be tested after onboarding a service?&lt;/h4&gt;
&lt;p&gt;Test normal user journeys, API clients, authentication flows, error handling, and rate-sensitive endpoints. Then run authorized cases for common web attacks and inspect the SafeLine attack list and details. Confirm that legitimate requests pass and that blocked requests produce enough information for the responsible team to investigate.&lt;/p&gt;
&lt;p&gt;Use this checklist to plan a measured rollout for your own microservices architecture, and review the official project and documentation for current deployment details. Project: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt; Docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt; Promotion: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31920/how-to-protect-a-microservices-architecture-with-a-waf-a-practical-safeline-checklist</guid>
<pubDate>Wed, 21 Oct 2026 04:29:35 +0000</pubDate>
</item>
<item>
<title>How to Protect a Microservices Architecture with a WAF</title>
<link>https://coderlegion.com/31919/how-to-protect-a-microservices-architecture-with-a-waf</link>
<description>&lt;p&gt;Microservices expand delivery flexibility, but they also create more HTTP entry points, routing paths, and service boundaries to review. A practical WAF strategy begins by deciding where external traffic should enter the system and which applications need direct protection. SafeLine is documented as a self-hosted web application firewall that filters and monitors HTTP traffic between web applications and the Internet. It works as a reverse proxy, placing a protective layer in front of the application before requests reach the server (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;official overview&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Start by mapping the public surface of the architecture. List customer portals, authentication endpoints, API gateways, upload services, administrative interfaces, and any service exposed through a public domain. For each hostname, identify its upstream application, listening port, transport security requirements, expected request methods, and business criticality. This inventory helps you place SafeLine at the edge of each public application while keeping internal service-to-service traffic governed by the controls appropriate to your environment.&lt;/p&gt;
&lt;p&gt;SafeLine's application model follows this reverse-proxy pattern. In the Web Admin Console, an administrator adds an application, supplies its domain, listening port, optional SSL setting, and upstream address, then resolves the domain to the SafeLine server. SafeLine receives the request, filters malicious traffic, and forwards trusted traffic to the original application (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;application guide&lt;/a&gt;). For a microservices platform, use a clear hostname and upstream mapping for every externally reachable service. This makes logs and policy decisions easier to associate with a particular API or user-facing component.&lt;/p&gt;
&lt;p&gt;Use the WAF as one layer in a broader request policy. SafeLine's documented defenses include protection against SQL injection, XSS, code injection, OS command injection, CRLF injection, XXE, SSRF, path traversal, and related web attacks. Its documented capabilities also include IP-based rate limiting, CAPTCHA challenges, authentication challenges, proactive bot abuse defense, and web access control lists (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;official overview&lt;/a&gt;). Apply these controls according to endpoint behavior. Rate limits may be especially useful for login, password reset, search, and resource-intensive API routes. Authentication challenges can provide an additional barrier for selected administrative surfaces.&lt;/p&gt;
&lt;p&gt;Validate the arrangement with safe test cases in a controlled environment. The application guide provides examples for SQL injection, XSS, path traversal, code injection, and XXE testing, and explains that attack details can be reviewed in the SafeLine console (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/AddApplication&quot;&gt;application guide&lt;/a&gt;). Review blocked requests alongside legitimate traffic so that policies reflect real application behavior. Also confirm that upstream services are reachable through the intended path and that DNS, ports, and SSL settings match the deployment design.&lt;/p&gt;
&lt;p&gt;For self-hosted deployment, the getting started guide lists Linux, x86_64 or arm64, Docker 20.10.14 or later, Docker Compose 2.0.0 or later, and minimum requirements of one CPU core, 1 GB memory, and 5 GB disk (&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/GetStarted/Deploy&quot;&gt;deployment guide&lt;/a&gt;). Treat those as starting requirements and size the host according to traffic, logging, and operational needs. The same guide documents the Web Console, application data directory, and administrator account initialization process.&lt;/p&gt;
&lt;p&gt;As of September 30, 2026, SafeLine surpassed 700,000 installations worldwide. SafeLine Pro annual promotional pricing is $650-$880 versus the $1,000 regular price. These publication details should be verified against the current commercial materials before release.&lt;/p&gt;
&lt;h4 id=&quot;where-should-safeline-sit-in-a-microservices-deployment-&quot;&gt;Where should SafeLine sit in a microservices deployment?&lt;/h4&gt;
&lt;p&gt;Place SafeLine in front of the public web applications or API entry points that receive traffic from the Internet. Configure each protected application with its domain, listening port, and upstream address, then direct the domain to the SafeLine server as described in the official application guide.&lt;/p&gt;
&lt;h4 id=&quot;should-every-internal-service-be-exposed-through-the-waf-&quot;&gt;Should every internal service be exposed through the WAF?&lt;/h4&gt;
&lt;p&gt;Begin with externally reachable services and administrative surfaces. Internal services should remain subject to the access controls and network design used for internal traffic. Expose a service through SafeLine when it has a public HTTP or HTTPS entry point that requires web attack filtering or request abuse controls.&lt;/p&gt;
&lt;h4 id=&quot;how-can-teams-reduce-disruption-during-rollout-&quot;&gt;How can teams reduce disruption during rollout?&lt;/h4&gt;
&lt;p&gt;Inventory routes first, test representative legitimate requests, and use controlled attack examples from the application guide. Check the SafeLine attack list and application behavior after each change. This gives the team evidence about blocked attacks, expected traffic, and any policy adjustment needed before expanding coverage.&lt;/p&gt;
&lt;h4 id=&quot;what-should-be-reviewed-after-deployment-&quot;&gt;What should be reviewed after deployment?&lt;/h4&gt;
&lt;p&gt;Review application mappings, upstream reachability, SSL settings, rate-limit targets, authentication challenge scope, and attack records. Repeat the review when a service gains a new public endpoint or changes its request format.&lt;/p&gt;
&lt;p&gt;If you are planning a microservices security review, use the official materials to build your application inventory and deployment checklist, then explore SafeLine through the project page and documentation: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31919/how-to-protect-a-microservices-architecture-with-a-waf</guid>
<pubDate>Wed, 21 Oct 2026 04:29:03 +0000</pubDate>
</item>
<item>
<title>Twenty Security Checks Before Your MCP Server Goes Public</title>
<link>https://coderlegion.com/31417/twenty-security-checks-before-your-mcp-server-goes-public</link>
<description>&lt;p&gt;An MCP server is effectively an API that agents call for people, and that gives it an unusual set of risks. The caller is a model that text from elsewhere can steer, the human may never see individual calls, and whatever you return might be read by yet another model. Most problems are familiar API errors amplified by that chain, so this checklist groups twenty checks by layer, with the reasoning for each.&lt;/p&gt;
&lt;p&gt;Transport: HTTPS only, validate the Origin header on every request (the spec requires it, to stop DNS rebinding), bind local servers to localhost and treat session IDs as untrusted. Authorisation: decide per tool what's public, publish protected-resource metadata, validate token audience and never pass a client's token through to another API.&lt;/p&gt;
&lt;p&gt;Input: validate every argument server-side, bound lengths and counts, never accept raw SQL, shell or file paths, and parameterise database calls. Output and prompt injection: treat submitted text as hostile, keep tool descriptions honest and static (changing them after approval or hiding instructions in them are known attacks), and return only what the output schema promises.&lt;/p&gt;
&lt;p&gt;Abuse and operations: rate-limit by IP and tool, annotate tools truthfully but enforce rules server-side too, cap anything that pings a human, return safe errors and log calls. I end with simple ways to test your own server.&lt;/p&gt;
&lt;h4 id=&quot;key-takeaways&quot;&gt;Key takeaways&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Validate the Origin header on Streamable HTTP endpoints&lt;/li&gt;
&lt;li&gt;Never forward tokens issued for someone else&lt;/li&gt;
&lt;li&gt;Reject raw query, shell or path arguments&lt;/li&gt;
&lt;li&gt;Keep tool descriptions static and honest&lt;/li&gt;
&lt;li&gt;Rate-limit write tools and log every call&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related on BuiltToWinWeb: &lt;a rel=&quot;nofollow&quot; href=&quot;https://built2winweb.com/blog/add-mcp-server-to-website/&quot;&gt;how to add an MCP server to a website&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Read the full guide on BuiltToWinWeb: &lt;a rel=&quot;nofollow&quot; href=&quot;https://built2winweb.com/blog/mcp-server-security-checklist/&quot;&gt;The MCP server security checklist&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A summary by Jacob Campbell of an article first published on built2winweb.com on October 5, 2026.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31417/twenty-security-checks-before-your-mcp-server-goes-public</guid>
<pubDate>Fri, 16 Oct 2026 16:17:59 +0000</pubDate>
</item>
</channel>
</rss>