| 👾 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 > |