flawopen.com/SQL Injection em Python/SQLAlchemy
SQLAlchemy text() é seguro contra SQL Injection?
Um parâmetro vinculado é como um cartão lacrado em um formulário de consulta: o SQLAlchemy passa a instrução SQL e o mapa de parâmetros ao DBAPI subjacente, mantendo os valores fora da expressão SQL montada pelo código. O driver DBAPI faz a vinculação específica do banco, então o transporte pode variar. text() aceita texto SQL, mas não sanitiza nem parametriza valores que já foram interpolados nesse texto.
stmt = text(
f"SELECT id FROM users WHERE id = {user_id}"
)
rows = conn.execute(stmt)
stmt = text(
"SELECT id FROM users WHERE id = :id"
)
rows = conn.execute(stmt, {"id": user_id})
# Bind values, not identifiers. Choose any
# selectable column from a fixed application map.
columns = {"name": users.c.name,
"created": users.c.created_at}
column = columns.get(requested_sort, users.c.created_at)
stmt = select(users.c.id).order_by(column)
rows = conn.execute(stmt)
O que text() faz — e o que não faz
text() cria uma construção de SQL textual; não sanitiza uma string que já contém entrada interpolada. Declare placeholders para os valores e passe-os separadamente a Connection.execute() ou Session.execute(). A API de expressões Core do SQLAlchemy vincula valores literais Python quando apropriado, mas fragmentos textuais continuam sendo sintaxe SQL. Parâmetros não substituem nomes de tabelas, colunas ou direções de ordenação. Mapeie a estrutura escolhida pelo usuário para expressões SQLAlchemy fixas. Parametrização previne SQL Injection, mas não substitui autorização nem validação das regras de negócio.
Como auditar seu código
rg -n 'text\(|\.execute\(' --glob '*.py' .Perguntas frequentes
Eles vinculam valores Python em construções normais de expressões, mas a segurança depende de como a instrução é montada. Revise SQL textual, construções SQL literais e identificadores dinâmicos. Nenhuma API torna segura uma string SQL após a concatenação de entrada.
Referências
- Tutorial SQLAlchemy 2.0 — Envio de parâmetros
- Tutorial SQLAlchemy 2.0 — Expressões SQL e SQL textual
- OWASP — Prevenção de SQL Injection
- flawopen.com — SQL Injection em Python