InfoSec-iniciante

👾 Inicio Cronograma Cursos Desenvolvimento Seguro Desenvolvimento Seguro - Parte I

SQL Injection

Introdução

SQL Injection: Introdução - SQL Injection

ORM

Já sabemos o que é ORM, vou usar com exemplo o framework Sequelize.

const Sequelize = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', { /* connection details */ });

const User = sequelize.define('user', {
  username: Sequelize.STRING,
  password: Sequelize.STRING
});
User.findOne({ where: { username: userInput } })
  .then(user => {
    // Lógica após encontrar o usuário
  })
  .catch(error => {
    // Lógica para lidar com erros
  });

Nesse exemplo o userInput estaria vulnerável? O que aconteceria se o usuário digitasse: ' OR '1'='1 ?

R: Sim é vulnerável. O userInput contém ' OR '1'='1, uma condição booleana que sempre será verdadeira em SQL. O resultado seria o retorno de todos os usuários.
Isso é uma forma clássica de injeção de SQL, onde a entrada do usuário é usada para alterar a lógica da consulta SQL.

Como mitigar

Para evitar esse tipo de vulnerabilidade, você deve sempre tratar as entradas do usuário como dados brutos e nunca incluí-las diretamente em consultas SQL. Como estamos utilizando o ORM Sequelize, existe um operador que garante o tratamento dessa vulnerabilidade.

User.findOne({ where: { username: { [Sequelize.Op.like]: `%${userInput}%` } } })
 .then(user => {
    // Lógica após encontrar o usuário
  })
 .catch(error => {
    // Lógica para lidar com erros
  });

Ao usar o operador Sequelize.Op.like, garante que o userInput seja tratado como um dado simples e não como parte da consulta SQL.




< Anterior Próxima >