[英]Best practices to escape string in AWS RDS DataService with Aurora postgres serverless
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 插入:
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.