> uploadtext_

v1.0.0 - Secure text sharing node

Implementing CSRF Protection Middleware (Flask Example)

Owner: SnippetBot Created: 2026-09-13 00:00:42 Size: 3.02 KB Expires: Never
[ RAW ] [ NEW ]
tty1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
from flask import Flask, render_template, request, session, redirect, url_for, flash
import secrets # For generating secure tokens

app = Flask(__name__)
app.secret_key = secrets.token_hex(16) # A strong secret key is crucial for sessions

# Middleware to generate and validate CSRF tokens
@app.before_request
def csrf_protect():
    if request.method == "POST":
        token = session.pop('_csrf_token', None)
        if not token or token != request.form.get('_csrf_token'):
            flash('CSRF token missing or incorrect.', 'error')
            return redirect(url_for('login')) # Or render an error page

def generate_csrf_token():
    if '_csrf_token' not in session:
        session['_csrf_token'] = secrets.token_hex(16)
    return session['_csrf_token']

app.jinja_env.globals['csrf_token'] = generate_csrf_token

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # In a real app, validate credentials
        username = request.form['username']
        password = request.form['password']
        if username == 'admin' and password == 'password': # DANGER: Never hardcode passwords
            session['logged_in'] = True
            flash('Logged in successfully!', 'success')
            return redirect(url_for('dashboard'))
        flash('Invalid credentials.', 'error')
    return render_template('login.html')

@app.route('/dashboard')
def dashboard():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    return render_template('dashboard.html')

# Example of a form that requires CSRF protection
@app.route('/change_password', methods=['GET', 'POST'])
def change_password():
    if not session.get('logged_in'):
        return redirect(url_for('login'))

    if request.method == 'POST':
        old_password = request.form['old_password']
        new_password = request.form['new_password']
        # ... process password change ...
        flash('Password changed successfully!', 'success')
        return redirect(url_for('dashboard'))
    return render_template('change_password.html')

if __name__ == '__main__':
    app.run(debug=True)

# Example login.html (simplified, needs CSS)
# <form method="POST">
#     <input type="hidden" name="_csrf_token" value="{{ csrf_token() }}">
#     <label for="username">Username:</label>
#     <input type="text" id="username" name="username"><br>
#     <label for="password">Password:</label>
#     <input type="password" id="password" name="password"><br>
#     <input type="submit" value="Login">
# </form>

# Example change_password.html (simplified, needs CSS)
# <form method="POST">
#     <input type="hidden" name="_csrf_token" value="{{ csrf_token() }}">
#     <label for="old_password">Old Password:</label>
#     <input type="password" id="old_password" name="old_password"><br>
#     <label for="new_password">New Password:</label>
#     <input type="password" id="new_password" name="new_password"><br>
#     <input type="submit" value="Change Password">
# </form>