Contornar o filtro
Uma lista negra olha a forma do texto; o atacante escreve a mesma coisa de outra forma.
Uma defesa comum e fraca é a lista negra: rejeitar a entrada se ela contiver uma palavra perigosa (owner, class, system). O problema é que a lista olha o TEXTO CRU que chegou, enquanto o motor olha o EFEITO depois de avaliar. Há sempre uma forma de escrever a mesma coisa que o filtro não reconhece.
A mais simples: acesso por ponto e por colchete são equivalentes (page.owner é page['owner']), e a chave entre colchetes pode ser uma expressão. Então a palavra bloqueada é montada em tempo de avaliação: page['own' ~ 'er'] constrói 'owner' só quando roda, e o texto enviado nunca contém owner inteiro.
A lição é que lista negra não segura injeção. O conserto de verdade é não deixar a entrada virar template e usar sandbox; se for restringir, use uma lista de permissão (só estes campos, só estas operações).