如何避免使用BigQuery客户端的SQL注入
#javascript #node #bigquery #sqlinjection

在ES6将Template String引入JavaScript之后,进行价值插值非常狂热。当我们谈论构造字符串格式时,使用这种方法似乎并不有趣。

在舞蹈的构造中使用模板弦可以打开SQL注入的大门。我们有避免这种情况的方法。

使用client BigQuery para NodeJS,我将向您展示两种编写舞蹈的方法。

com模板字符串

// Params
const gender = "M";
const states = ["WA", "WI", "WV", "WY"]
   .map((state) => `'${state}'`)
   .join(", ");

// Query
const sqlQuery = `SELECT name, sum(number) as count
  FROM \`<YOUR_TABLE_NAME>\`
  WHERE gender = '${gender}'
  AND state IN (${states});`;

// Run the query
const [rows] = await bigquery.query(sqlQuery);

console.log("Result -> ", rows);

com参数查询

参考:https://cloud.google.com/bigquery/docs/parameterized-queries

const gender = "M";
const states = ["WA", "WI", "WV", "WY"];

// Query
const sqlQuery = `SELECT name, sum(number) as count
  FROM \`<YOUR_TABLE_NAME>\`
  WHERE gender = @gender'
  AND state IN UNNEST(@states);`;

const options = {
  query: sqlQuery,
  params: { gender, states },
};

// Run the query
const [rows] = await bigquery.query(options);

console.log("Result -> ", rows);

我们可以设置类型ð

// ...
const options = {
  query: sqlQuery,
  params: { gender, states },
  types: {
    gender: 'STRING',
    states: ['STRING'],
  },
};
// ...

使用参数化查询,我们以正确的方式使用客户端,就像BigQuery建议并避免使用SQL注入一样。

我希望我能为您提供帮助。