Безопасность с CSRFProtect

CSRFProtect (Cross-Site Request Forgery Protection) – это расширение для Flask, которое помогает защитить ваше приложение от атак типа CSRF. Оно предотвращает возможность того, что запросы пользователей могут быть подделаны злоумышленниками, чтобы выполнить небезопасные действия на сайте.

Пример использования CSRFProtect на Flask:

from flask import Flask, redirect, render_template, request, 
session

from flask_wtf.csrf import CSRFProtect



app = 
Flask(__name__)

csrf = CSRFProtect(app)

app.secret_key = 
'mysecretkey'



@app.route('/')

def index():

    
return render_template('index.html')



@app.route('/login', 
methods=['POST'])

def login():

    session['user'] = 
request.form['username']

    return 
redirect('/dashboard')



@app.route('/dashboard')

def 
dashboard():

    if 'user' not in session:

        return 
redirect('/')

    return render_template('dashboard.html')



if 
__name__ == '__main__':

    app.run(debug=True)

В этом примере CSRFProtect используется для защиты от подделки запросов в форме входа пользователя. При отправке формы пользователь вводит свое имя пользователя и пароль, которые сохраняются в сессии. Затем он перенаправляется на страницу панели управления. Если пользователь не аутентифицирован, он будет перенаправлен на основную страницу.

Включаем защиту CSRF на Flask

Чтобы включить защиту CSRF в своем проекте Flask, вы должны установить Flask-WTF и импортировать CSRFProtect из flask_wtf:

from flask_wtf.csrf import CSRFProtect

 

Затем вы должны создать экземпляр класса и привязать его к приложению:

from flask_wtf.csrf import CSRFProtect

 

Теперь, когда вы создаете форму, Flask-WTF в автоматическом режиме добавляет скрытую строку CSRF за счет использования тега `{% csrf_token() %}` в вашей форме. При отправке формы этот токен будет сравниваться с CSRF токеном в вашей сессии. Если они не совпадают, форма не будет отправляться.

```html
<form method="POST">
{% csrf_token() %}
<label>Username:</label>
<input type="text" name="username">
<label>Password:</label>
<input type="password" name="password">
<button type="submit">Login</button>
</form>
```

Это обеспечивает дополнительный уровень безопасности для вашего приложения Flask и защищает вас от CSRF атак.