import unicodedata
PRIVATE = {"salaries", "customers"}
def canonical(name: str) -> str:
return unicodedata.normalize("NFC", name).strip().lower()
def get_rows(table: str, user):
real = canonical(table) # normaliza UMA vez
if real in PRIVATE and not user.is_admin:
raise Forbidden()
return db.execute("select * from tables where name = ?", [real])
db.execute("select * from tables where name = ?", [real])
Ainda tem uma falha, passe table como "salaries ;-- " e veja a segurança indo pro ralo, se realmente quer corrigir assim, ANTES verifique se a tabela existe:
if real not in DB_TABLES:
raise Forbidden()
No entanto a melhor abordagem nesse modelo é, além de checar se a tabela existe, ter a política: NENHUMA tabela é selecionável por padrão, apenas as explicitamente definidas como selecionáveis podem ser selecionadas
Se puder usar views prontas é melhor ainda