👾 Inicio | Cronograma | Cursos | Desenvolvimento Seguro | Desenvolvimento Seguro - Parte I |
SQL Injection
: Introdução - SQL Injection
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.
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 > |