Quebra o texto em palavras com significado: SELECT, identificador, número
Monta a árvore, verificando se a ordem das palavras faz sentido
A tabela existe? A coluna existe? O tipo bate? Isso vem do catálogo
comando := create | insert | select create := CREATE TABLE nome ( coluna+ ) insert := INSERT INTO nome VALUES ( valor+ ) select := SELECT lista FROM nome [ WHERE coluna = valor ]
Só isso. Sem junção, sem ORDER BY, sem agregação, sem subconsulta. É o suficiente para o critério de pronto.
Catálogo é o conjunto de tabelas em que o banco guarda a descrição das outras tabelas.
pg_class, pg_attribute, pg_indexPor que concatenar string quebra, e parâmetro não?
# concatenação: o texto do usuário vira gramática sql = "SELECT * FROM aluno WHERE nome = '" + nome + "'" # nome = "x' OR '1'='1" → a condição sempre é verdadeira # parâmetro: o texto do usuário nunca passa pelo parser cursor.execute("SELECT * FROM aluno WHERE nome = %s", (nome,))
O parser decide o que é comando e o que é dado. Concatenar string apaga essa fronteira, e é por isso que a injeção existe.
Quem implementou um parser não esquece mais essa distinção. É o motivo de segurança ser ensinada aqui, e não numa aula separada.
Próxima: laboratório do M4, tokenizador e parser