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.

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Retry later