Criar banco de dados de entrada do usuário com declaração preparada para evitar a injeção de SQL

Johnny:

Em nossa aplicação, estamos aceitando a entrada do usuário (como nome do projeto) e, em seguida, usá-lo para criar um banco de dados para o usuário (entre outras coisas). Gostaria de evitar a injeção SQL, mas não pode se preparar instrução SQL para criar um banco de dados e conceder acesso. Existe uma maneira segura para evitar que os usuários de SQL nos injetáveis? Tudo que eu poderia pensar é limitar a entrada para letras do alfabeto Inglês e espaços (e para o nome DB substituí-los por sublinhados), que por sua vez poderia fornecer proteção se nós colocar nossas instruções SQL dentro de aspas simples. Será esta uma solução plausível?

Estamos usando java inicialização 8 / primavera com um 10,6 banco de dados Postgres. Eu brinquei com SQL e uma declaração preparada, no meu entender, pode ser utilizado para consultas como update, delete e update. Eu tentei brincar o código para tentar soltar algumas tabelas de entrada do usuário, mas, felizmente, não funcionou, mas eu gostaria de ter certeza de que a aplicação não é deixada vulnerável.

String createDbSQL = "create database ?";
Connection connection = DriverManager.getConnection(env.getDbUrl(), env.getDbUsername(), env.getDbPassword());
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement(createDbSQL);
preparedStatement.setString(1, "test_db_name");
preparedStatement.execute();

falha com org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"(o que faz sentido se declaração preparada não pode ser usado para criar database`

PREPARE foo (text) AS create alter database $1;

espera expressão de consulta e não funciona

Nathan Hughes:

Isso não é necessário, e poderia causar problemas para além de apenas as possibilidades de injeção SQL. Se você está encarregado de fornecer o banco de dados que você precisa para estar no comando de nomeação.

Você pode permitir que o usuário fornecer um nome, na medida em que está em causa é o nome do banco de dados, mas o seu código para criar e usar o banco de dados pode usar um nome que você gerar e controlar a si mesmo. Dessa forma, se por algum motivo você precisa dar-lhe um nome diferente, ou criar uma nova cópia do banco de dados, ou mudar para uma plataforma de banco de dados diferente, onde o nome fornecido pelo usuário segue regras diferentes (e talvez o seu nome escolhido não é válido) , você não está impedido de nada disso.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=207656&siteId=1
Recomendado
Clasificación