簡體   English   中英

使用 Aurora postgres serverless 在 AWS RDS DataService 中轉義字符串的最佳實踐

[英]Best practices to escape string in AWS RDS DataService with 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 一起使用時,傳遞 string: myname's並且它破壞了我的 SQL 語法。 我不確定 RDSDataService 如何處理文檔中所寫的 SQL 注入攻擊。

誰能幫我解釋一下? 在這種情況下如何處理安全的 SQL 字符串?

更新:對不起我的不好。 使用參數化查詢時,RDSDataService 已經轉義了字符串文字。

以下是一些基本代碼,用於從 Redshift 或 Aurora 獲取返回值並將其轉換為以批處理參數集的形式插入到數據庫中:

獲取包含元數據的響應並將其傳遞到此 function。 它將解析為字符串或整數。 如果您需要支持更多數據類型,則必須在下面的 function 中創建更多 if 語句:

 const data = { "ColumnMetadata": [ { "isCaseSensitive": true, "isCurrency": false, "isSigned": false, "label": "dealer_name", "length": 0, "name": "dealer_name", "nullable": 1, "precision": 255, "scale": 0, "schemaName": "raw_data", "tableName": "xxxxxxxxxxxxxxxxx", "typeName": "varchar" }, { "isCaseSensitive": true, "isCurrency": false, "isSigned": false, "label": "city", "length": 0, "name": "city", "nullable": 1, "precision": 255, "scale": 0, "schemaName": "raw_data", "tableName": "xxxxxxxxxxxxxxxxx", "typeName": "varchar" }, { "isCaseSensitive": false, "isCurrency": false, "isSigned": true, "label": "vehicle_count", "length": 0, "name": "vehicle_count", "nullable": 1, "precision": 19, "scale": 0, "schemaName": "", "tableName": "", "typeName": "int8" } ], "Records": [ [ { "stringValue": "Grand Prairie Ford Inc." }, { "stringValue": "Grand Prairie" }, { "longValue": 18 } ], [ { "stringValue": "Currie Motors Ford of Valpo" }, { "stringValue": "Valparaiso" }, { "longValue": 16 } ] ], "TotalNumRows": 2 } const buildParameterSets = (res) => { let columns = res.ColumnMetadata.map((c) => [c.name, c.typeName] );//get type and name of column let data = res.Records.map((r) => { let arr = r.map((v, i) => { if (columns[i][1].includes("int")) { return { name: columns[i][0], value: { longValue: Object.values(v)[0] } } } else { return { name: columns[i][0], value: { stringValue: Object.values(v)[0] } } } }); return arr; }); return data; }; console.log(buildParameterSets(data));

然后,您可以使用 AWS SDK 中的 BatchExecuteStatementCommand 插入:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM