DEV Community

Cover image for Como evitar SQL Injection utilizando client do BigQuery
Gabriel Ferreira
Gabriel Ferreira

Posted on

Como evitar SQL Injection utilizando client do BigQuery

Depois que o ES6 introduziu Template String no Javascript, ficou muito fácil fazer interpolação de valores. Porém quando falamos em construção de queries em formato de string, utilizar essa abordagem não é tão interessante quanto se parece.

Utilizar template string na construção de queries, pode abrir uma porta muito grande para SQL injection. Temos formas de evitar isso.

Utilizando o client BigQuery para NodeJS, vou mostrar pra vocês 2 caminhos para escrita de queries.

❌ Com template strings

// 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);
Enter fullscreen mode Exit fullscreen mode

✅ Com parameterized queries

Ref: 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);
Enter fullscreen mode Exit fullscreen mode

Podemos setar tipos 😍

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

Com parameterized queries utilizamos o client da forma correta, assim como o BigQuery recomenda e evitamos SQL injection.

Espero ter te ajudado.

Top comments (0)