') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - KamrulStack/cloudflare-security-rules: This repository provides a complete Cloudflare WAF setup guide, including custom rules for bot protection, country blocking, and CAPTCHA verification. Learn how to configure firewall settings step by step to secure your website against threats. · GitHub
Skip to content

Latest commit

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🔥 Cloudflare Web Application Firewall (WAF) and Security Setup

🌍 Overview

This repository provides a complete step-by-step guide to setting up and configuring Cloudflare Web Application Firewall (WAF). It helps protect websites against malicious attacks, bot traffic, and unauthorized access. This guide includes the process of creating custom rules, understanding firewall settings, and applying CAPTCHA verification to enhance security and performance.


📌 How to Create Cloudflare WAF Rules (Step-by-Step Guide)

🚀 Step 1: Accessing Cloudflare Security Settings

  1. 🔑 Login to Cloudflare: Go to Cloudflare Dashboard and log in.
  2. 🌐 Select Your Website: Click on the website you want to protect.
  3. 🛡️ Navigate to WAF: In the left sidebar, go to Security > WAF (Web Application Firewall).
  4. ⚙️ Go to Custom Rules: Click on the Custom Rules tab.

🏗️ Step 2: Creating a New Custom Rule

  1. Click on ➕ Create Rule.
  2. Enter a 📝 Rule Name (e.g., CAPTCHA SKIP for bots).
  3. Choose a 📌 Field (e.g., User Agent to detect bots).
  4. Select an ⚙️ Operator (e.g., contains to match specific bots).
  5. Enter a 📥 Value (e.g., Googlebot for Google Search bot).
  6. Choose an 🔒 Action (e.g., Skip for trusted bots, Block for countries, or Managed Challenge for CAPTCHA).
  7. Set the 🔄 Placement Order (first, after another rule, etc.).
  8. Click 💾 Save and ensure the rule is ✅ Enabled.

🎯 Custom Rules Configuration (Basic to Advanced)

Below are three essential WAF rules, explained in three formats: Table Format, Copyable Code Format, and Detailed Explanation.


1️⃣ CAPTCHA SKIP Rule (Allowing Search Engine Bots) 🤖

📋 Table Format

📌 Field⚙️ Operator📥 Value
User Agentcontainsfacebookexternalhit
ORcontainsTwitterBot
ORcontainsLinkedInBot
ORcontainsGooglebot
ORcontainsBingbot
🔒 ActionSkip
🔄 PlacementFirst

📜 Copyable Code Format

Rule Name: CAPTCHA SKIP
Field: User Agent
Operator: contains
Value: facebookexternalhit
OR
Field: User Agent
Operator: contains
Value: TwitterBot
OR
Field: User Agent
Operator: contains
Value: LinkedInBot
OR
Field: User Agent
Operator: contains
Value: Googlebot
OR
Field: User Agent
Operator: contains
Value: Bingbot
Action: Skip
Placement: First

📖 Detailed Explanation

  • 🎯 Purpose: This rule allows legitimate search engine bots to access your website without being blocked by CAPTCHA.
  • 📌 Field: User Agent checks if the visitor is a bot.
  • ⚙️ Operator: contains applies if the bot’s name appears.
  • 📥 Values: Recognized search bots like Googlebot, Bingbot, etc.
  • 🔒 Action: Skip allows these bots to bypass security checks.
  • 🔄 Placement: This rule should be first in order.

2️⃣ COUNTRY BLOCK Rule (Blocking Specific Countries) 🌍

📋 Table Format

📌 Field⚙️ Operator📥 Value
CountryequalsUnited Kingdom
ORequalsUnited States
🔒 ActionBlock
🔄 PlacementAfter CAPTCHA SKIP

📜 Copyable Code Format

Rule Name: COUNTRY BLOCK
Field: Country
Operator: equals
Value: United Kingdom
OR
Field: Country
Operator: equals
Value: United States
Action: Block
Placement: After CAPTCHA SKIP

📖 Detailed Explanation

  • 🎯 Purpose: Blocks traffic from selected countries to prevent fraud or unwanted access.
  • 📌 Field: Country checks the visitor’s location.
  • ⚙️ Operator: equals applies only to the listed countries.
  • 📥 Values: United Kingdom, United States (can add more if needed).
  • 🔒 Action: Block denies access to these users.
  • 🔄 Placement: Should be after the CAPTCHA SKIP rule.

3️⃣ CAPTCHA ON Rule (Adding Verification for Suspicious Traffic) 🔐

📋 Table Format

📌 Field⚙️ Operator📥 Value
Hostnamewildcardmail.kamrul.us
ORwildcardkamrul.us/SOFT
ORwildcardkamrul.us
🔒 ActionManaged Challenge
🔄 PlacementAfter COUNTRY BLOCK

📜 Copyable Code Format

Rule Name: CAPTCHA ON
Field: Hostname
Operator: wildcard
Value: mail.kamrul.us
OR
Field: Hostname
Operator: wildcard
Value: kamrul.us/SOFT
OR
Field: Hostname
Operator: wildcard
Value: kamrul.us
Action: Managed Challenge
Placement: After COUNTRY BLOCK

📖 Detailed Explanation

  • 🎯 Purpose: Protects sensitive pages by forcing visitors to pass a CAPTCHA challenge.
  • 📌 Field: Hostname applies the rule to specific site sections.
  • ⚙️ Operator: wildcard matches similar URLs.
  • 🔒 Action: Managed Challenge presents CAPTCHA verification.
  • 🔄 Placement: Runs after COUNTRY BLOCK rule.

🔍 Final Verification & Troubleshooting

How to Check if Rules Are Working?

  1. 🛠️ Test the site from different locations (use VPN for testing country blocks).
  2. 🔍 Use browser developer tools (F12 > Network > Inspect HTTP headers).
  3. 📊 Check Cloudflare Security Logs (Security > WAF > Logs).

image

image

image

image

image

🏆 License & Contact

This guide is open-source under the MIT License. For further support, contact kamrul.us Admin or visit Cloudflare Support.

image

About

This repository provides a complete Cloudflare WAF setup guide, including custom rules for bot protection, country blocking, and CAPTCHA verification. Learn how to configure firewall settings step by step to secure your website against threats.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors