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
Markuppara 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.
Opções de Set-Cookie
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.