Crear la base de datos de entrada del usuario con la declaración preparada para evitar la inyección de SQL

Johnny:

En nuestra aplicación, estamos aceptando la entrada del usuario (como el nombre del proyecto) y luego usarla para crear una base de datos para el usuario (entre otras cosas). Me gustaría evitar la inyección de SQL, pero no puedo preparar instrucción SQL para la creación de una base de datos y la concesión de acceso. ¿Hay una manera segura para evitar que los usuarios de SQL nos inyectables? Todo lo que podía pensar es limitar la entrada a las letras del alfabeto Inglés y espacios (como el nombre del DB reemplazarlos con guiones), que a su vez podría proporcionar protección si adjuntamos nuestras sentencias SQL dentro de comillas simples. ¿Es esta una solución plausible?

Estamos utilizando java arranque 8 / primavera con una base de datos PostgreSQL 10.6. He jugado un poco con SQL y una declaración preparada, a mi entender, puede ser utilizado para las consultas como actualizar, eliminar y actualizar. He tratado de tocar el violín alrededor del código que tratar de llevar algunas tablas a partir de la entrada del usuario, pero, afortunadamente, no funcionaba, pero me gustaría estar seguro de que la aplicación no se deja vulnerables.

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();

falla con org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"(lo cual tiene sentido si declaración preparada no puede ser utilizado para crear database`

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

espera expresión de consulta y no funciona

Nathan Hughes:

Esto no es necesario, y podría causar problemas más allá de las posibilidades de inyección SQL. Si usted está a cargo de proporcionar la base de datos que necesita para estar a cargo de nomenclatura.

Puede dejar que el usuario proporcione un nombre, en lo que a ellos respecta que es el nombre de la base de datos, pero su código para crear y utilizar la base de datos puede utilizar un nombre que se genera y controlarse a sí mismo. De esta manera, si por alguna razón, tiene que darle un nombre diferente, o crear una nueva copia de la base de datos, o cambiar a una plataforma de base de datos diferente, donde el nombre proporcionado por el usuario sigue diferentes reglas (y tal vez su nombre elegido no es válido) , que no se impida a cualquiera de eso.

Supongo que te gusta

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