Desenvolvimento Seguro de Aplicações Web Flask

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, exploraremos considerações importantes de segurança ao desenvolver aplicações web usando Flask. Abordaremos tópicos como Cross-Site Scripting (XSS), Cross-Site Request Forgery (CSRF), segurança JSON, cabeçalhos de segurança e opções de cookies seguros. Ao seguir estes passos, você aprenderá como aprimorar a segurança de suas aplicações Flask.

Nota: Você precisa criar o arquivo de código você mesmo e executá-lo no ambiente. Você pode visualizar o status do serviço Flask em Web 5000.

Cross-Site Scripting (XSS)

Cross-Site Scripting (XSS) é uma vulnerabilidade que permite que atacantes injetem scripts maliciosos em páginas web visualizadas por usuários. Para prevenir ataques XSS em Flask, siga estas diretrizes:

  • Sempre faça o escape do texto para evitar a inclusão de tags HTML arbitrárias.
  • Seja cauteloso ao gerar HTML sem a ajuda de templates Jinja2.
  • Use a classe Markup para fazer o escape de dados enviados pelo usuário.
  • Evite enviar arquivos HTML ou de texto a partir de arquivos carregados.

Exemplo de código:

## app.py

from flask import Flask, render_template_string, Markup

app = Flask(__name__)

@app.route('/')
def index():
    value = '<script>alert("XSS Attack")</script>'
    safe_value = Markup.escape(value)
    return render_template_string('<input value="{{ value }}">', value=safe_value)

Para executar o código, salve-o em um arquivo chamado app.py e execute o comando flask run.

Cross-Site Request Forgery (CSRF)

Cross-Site Request Forgery (CSRF) é um ataque que engana usuários para que realizem ações não intencionais em um website. Para prevenir ataques CSRF em Flask, siga estas diretrizes:

  • Use tokens de uso único para validar requisições que modificam o conteúdo do servidor.
  • Armazene o token no cookie e transmita-o com os dados do formulário.
  • Compare o token recebido no servidor com aquele armazenado no cookie.

Exemplo de código:

## app.py

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

app = Flask(__name__)
app.secret_key = 'secret_key'

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

@app.route('/delete', methods=['POST'])
def delete_user():
    if request.method == 'POST':
        token = request.form.get('token')
        if token and token == session.get('csrf_token'):
            ## Delete user profile
            return redirect(url_for('index'))
    return 'Invalid request'

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

Para executar o código, salve-o em um arquivo chamado app.py e execute o comando flask run.

Segurança JSON

Em Flask, é importante garantir a segurança das respostas JSON. Em versões anteriores ao Flask 0.10, arrays de nível superior não eram serializados para JSON devido a uma vulnerabilidade de segurança. No entanto, esse comportamento foi alterado, e arrays de nível superior agora são serializados. É recomendado usar a versão mais recente do Flask para aproveitar essa melhoria de segurança.

Headers de Segurança

Os navegadores reconhecem vários headers de resposta para controlar a segurança. É recomendado revisar e usar os seguintes headers de segurança em sua aplicação Flask:

  • HTTP Strict Transport Security (HSTS): Informa ao navegador para converter todas as requisições HTTP para HTTPS.
  • Content Security Policy (CSP): Especifica de onde vários tipos de recursos podem ser carregados.
  • X-Content-Type-Options: Força o navegador a honrar o tipo de conteúdo da resposta.
  • X-Frame-Options: Impede que sites externos incorporem seu site em um iframe.

Você pode usar a extensão Flask-Talisman para gerenciar HTTPS e headers de segurança em sua aplicação Flask.

Ao definir cookies em Flask, é importante considerar as opções de segurança para proteger dados sensíveis. Algumas opções recomendadas são:

  • Secure: Limita os cookies apenas ao tráfego HTTPS.
  • HttpOnly: Protege o conteúdo dos cookies de serem lidos com JavaScript.
  • SameSite: Restringe como os cookies são enviados com requisições de sites externos.

Exemplo de código:

## app.py

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def index():
    response = make_response('Hello, world!')
    response.set_cookie('username', 'flask', secure=True, httponly=True, samesite='Lax')
    return response

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

Para executar o código, salve-o em um arquivo chamado app.py e execute o comando flask run.

HTTP Public Key Pinning (HPKP)

HTTP Public Key Pinning (HPKP) é um recurso de segurança que instrui o navegador a autenticar com o servidor usando apenas uma chave de certificado específica. Embora isso possa aumentar a segurança, também é difícil desfazer se configurado ou atualizado incorretamente. Considere usar HPKP com cautela e garanta a configuração adequada.

Resumo

Neste laboratório, exploramos considerações importantes de segurança ao desenvolver aplicações web com Flask. Cobrimos medidas para prevenir ataques de Cross-Site Scripting (XSS) e Cross-Site Request Forgery (CSRF), bem como a segurança de respostas JSON e a configuração de cabeçalhos de segurança e opções de cookies. Ao seguir estas práticas de segurança, você pode aprimorar a segurança de suas aplicações Flask e proteger os dados do usuário de potenciais vulnerabilidades.