flawopen.com/Referência/FastAPI SQL Injection
O FastAPI impede SQL Injection por padrão?
O Pydantic verifica se um valor corresponde ao tipo declarado; não reescreve SQL nem transforma uma string Python em parâmetro de banco de dados. Um name: str validado continua sendo texto controlado por quem chamou a API. Pense na validação como conferir a etiqueta de um pacote: ela identifica o tipo do conteúdo, enquanto a parametrização mantém o valor separado das instruções SQL. Mantenha o modelo da consulta fixo e passe os valores separadamente pelo SQLAlchemy.
Padrão vulnerável vs. seguro no FastAPI
# Verificar o tipo string não torna a entrada segura na sintaxe SQL
@app.get("/users")
def get_users(name: str, db: Session = Depends(get_db)):
query = text(f"SELECT * FROM users WHERE name = '{name}'")
return db.execute(query).fetchall()
# :name é um parâmetro; o valor é passado separadamente
@app.get("/users")
def get_users(name: str, db: Session = Depends(get_db)):
query = text("SELECT * FROM users WHERE name = :name")
return db.execute(query, {"name": name}).fetchall()
O que a parametrização não protege
Um parâmetro vincula um valor, não o nome de uma tabela ou coluna, um operador SQL nem uma direção de ordenação. Se a requisição precisar escolher um campo de ordenação, mapeie a escolha para uma allow-list fixa de expressões de coluna do SQLAlchemy; nunca insira a string da requisição diretamente no SQL. A parametrização também não substitui autorização: restrinja quais linhas a pessoa pode ler e use uma conta de banco com apenas os privilégios necessários ao endpoint.
Checklist de prevenção
- ✓Nunca interpole dados da requisição em
text()do SQLAlchemy nem em strings executadas diretamente no banco. - ✓Use parâmetros nomeados e passe os valores separadamente, por exemplo
db.execute(query, {"name": name}). - ✓Para tabelas, colunas ou ordenações dinâmicas, mapeie a entrada para uma allow-list fixa de expressões SQLAlchemy conhecidas.
- ✓Verifique a autorização por linha separadamente e conceda à conta do banco apenas os privilégios necessários ao endpoint.
- ✓Prefira expressões
select()do SQLAlchemy quando forem claras; usar ORM não torna seguro um SQL bruto inseguro.
Referências
- FastAPI — bancos de dados SQL (relacionais)
- SQLAlchemy — envio de parâmetros e SQL textual
- OWASP — prevenção de SQL Injection