Рекомендации по экранированию строки в AWS RDS DataService с помощью Aurora postgres serverless

Я читал: https://aws.amazon.com/blogs/database/using-the-data-api-to-interact-with-an-amazon-aurora-serverless-mysql-database/

Клиент RDSDataService также поддерживает параметризованные запросы, позволяя использовать параметры-заполнители в операторах SQL. Экранированные входные значения позволяют разрешать эти параметры во время выполнения. Параметризованные запросы полезны для предотвращения атак с использованием SQL-инъекций.

Но когда я использую его с Postgres, передайте строку: myname'sи это нарушает мой синтаксис SQL. Я не уверен, как RDSDataService справляется с атаками SQL-инъекций, как они написаны в документе.

Может ли кто-нибудь помочь мне объяснить это? а как быть в таком случае с безопасной SQL String?

ОБНОВЛЕНО: извините за мою плохую работу. RDSDataService уже экранировал строковый литерал при использовании параметризованных запросов.

1 ответ

Решение

Вот базовый код для получения возвращаемых значений из Redshift или Aurora и преобразования их для вставки в базу данных в пакетном наборе параметров:

Возьмите свой ответ, включая метаданные, и передайте его в эту функцию. Он будет разбираться как строки или целые числа. Если вам нужно больше поддерживаемых типов данных, вам придется создать больше операторов if в функции ниже:

Затем вы можете вставить с помощью BatchExecuteStatementCommand из AWS SDK:

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-rds-data/classes/batchexecutestatementcommand.html

      const rds_client = new RDSDataClient({ region: "us-east-2" });
let insert_sql = `INSERT INTO dealer_inventory (
  dealer_name,
  city,
  vehicle_count
  ) VALUES (
    :dealer_name,
    :city,
    :vehicle_count
  )`;

try {
// insert data
  const insert_params = {
    database: "dev",
    parameterSets: parameterSets,
    sql: insert_sql,
    secretArn: process.env.SECRET_ARN,
    resourceArn: process.env.RESOURCE_ARN,
  };

  const insert_command = new RDSBatchExecuteStatementCommand(insert_params);
  var insert_response = await rds_client.send(insert_command);

} catch (error) {

  console.log("RDS INSERT ERROR");
  console.log(error.message);

} finally {

  console.log("Inserted: ");
  console.log(insert_response);

}
Другие вопросы по тегам