Basic WAF (Web Application Firewall)

from flask import Flask, request, render_template_string
import re

app = Flask(__name__)

# Define common attack patterns to block with tailored messages
BLOCKED_PATTERNS = {
    r"' OR '1'='1'": "Detected SQL Injection attempt: This input could manipulate database queries.",
    r"'(.*?)--": "Detected SQL Injection attempt: This input could terminate a query.",
    r"<script.*?>": "Detected XSS attempt: This input could execute malicious scripts in users' browsers.",
    r"(?i)DROP\s+TABLE": "Detected SQL Injection attempt: This input could delete database tables.",
    r"(?i)SELECT\s+\*": "Detected SQL Injection attempt: This input could retrieve sensitive data from the database.",
    r"(?i)INSERT\s+INTO": "Detected SQL Injection attempt: This input could insert data into the database.",
    r"(?i)DELETE\s+FROM": "Detected SQL Injection attempt: This input could delete data from the database.",
    r"(?i)UPDATE\s+\w+\s+SET": "Detected SQL Injection attempt: This input could update database records.",
    r"(?i)UNION\s+SELECT": "Detected SQL Injection attempt: This input could combine results from multiple queries.",
    r"<iframe.*?>": "Detected XSS attempt: This input could embed malicious content.",
    r"(?i)EXEC\s+": "Detected SQL Injection attempt: This input could execute arbitrary commands.",
}

def check_input(payload):
    for pattern, message in BLOCKED_PATTERNS.items():
        if re.search(pattern, payload):
            return message, False
    return "Input received safely. Thank you!", True

@app.route('/', methods=['GET', 'POST'])
def index():
    payload = request.form.get('input', '')
    message, is_safe = check_input(payload) if payload else (None, False)
    show_refresh = True  # Always show the refresh button
    return render_template_string(render_template(message, payload, show_refresh, is_safe))

def render_template(message, payload, show_refresh, is_safe):
    message_color = "green" if is_safe else "red" if message else "black"
    refresh_button = '<form action="/" method="get"><input type="submit" value="Refresh"></form>' if show_refresh else ''
    return f'''
        <h1>Web Application Firewall</h1>
        <form method="post">
            Input: <input type="text" name="input" value="{payload}">
            <input type="submit" value="Submit">
        </form>
        <h3 style="color: {message_color};">{message if message else ""}</h3>
        {refresh_button}
    '''

if __name__ == "__main__":
    app.run(port=5000)