A Injeção de SQL (SQL Injection) é um dos ataques mais comuns em aplicações web e é classificado como um dos dez principais riscos de segurança pela OWASP Top 10.
Neste artigo, exploraremos o que é a Injeção de SQL, quais são seus efeitos e como prevenir esse tipo de vulnerabilidade em aplicações desenvolvidas em Java, JavaScript e Python.
O que é a Injeção de SQL?
A Injeção de SQL ocorre quando um invasor insere comandos SQL maliciosos em uma entrada de usuário para enganar o banco de dados e realizar ações que não foram projetadas para serem executadas. Esses ataques podem ser usados para roubar dados, excluir informações importantes ou mesmo obter acesso total ao banco de dados.
Um ataque bem-sucedido pode resultar em roubo de informações confidenciais, perda de dados importantes e até mesmo o acesso não autorizado a informações sensíveis.
Além disso, a reputação da empresa pode ser seriamente afetada, resultando em perda de confiança dos clientes e parceiros de negócios, além de multas e ações legais.
SQL Injection em Java
Nesse exemplo, o código constrói uma consulta SQL a partir de strings fornecidas pelo usuário (username e password). No entanto, se um usuário mal-intencionado inserir caracteres de aspas simples (‘) em um desses campos, ele pode manipular a consulta para executar ações maliciosas.
String username = request.getParameter("username");
String password = request.getParameter("password");
String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet result = statement.executeQuery();
Solução
Uma maneira de evitar a vulnerabilidade de SQL Injection em Java é usar o PreparedStatement em vez do Statement. O PreparedStatement permite que os parâmetros sejam definidos dinamicamente, sem a necessidade de concatenar diretamente com a consulta SQL.
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
Javascript
Nesse exemplo, o código também constrói uma consulta SQL a partir de strings fornecidas pelo usuário. Se um usuário mal-intencionado inserir caracteres de aspas simples (‘) em um desses campos, ele pode manipular a consulta para executar ações maliciosas.
var username = document.forms["myForm"]["username"].value;
var password = document.forms["myForm"]["password"].value;
var sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
db.query(sql, function(err, result) {
// callback function
});
Solução
No JavaScript, podemos evitar vulnerabilidades de SQL Injection usando parâmetros de consulta com o módulo mysql. O mysql permite que os parâmetros sejam definidos dinamicamente, sem a necessidade de concatenar diretamente com a consulta SQL.
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydatabase'
});
const username = 'john';
const password = 'pass123';
const query = 'SELECT * FROM users WHERE username = ? AND password = ?';
connection.query(query, [username, password], (error, results) => {
if (error) throw error;
console.log(results);
});
Python
O código abaixo também constrói uma consulta SQL a partir de strings fornecidas pelo usuário. Se um usuário mal-intencionado inserir caracteres de aspas simples (‘) em um desses campos, ele pode manipular a consulta para executar ações maliciosas.
username = input("Enter username: ")
password = input("Enter password: ")
sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"
cursor.execute(sql)
result = cursor.fetchall()
Solução
Em Python, podemos evitar SQL Injection usando parâmetros de consulta em vez de concatenar diretamente com a consulta. Podemos usar a biblioteca pymysql para estabelecer uma conexão com o banco de dados e executar a consulta.
import pymysql
db = pymysql.connect(host="localhost", user="root", password="password", database="mydatabase")
cursor = db.cursor()
username = "john"
password = "pass123"
sql = "SELECT * FROM users WHERE username = %s AND password = %s"
values = (username, password)
cursor.execute(sql, values)
results = cursor.fetchall()
for row in results:
print(row)
Conclusão
A Injeção de SQL é uma ameaça grave à segurança de aplicações web. É importante estar ciente dos riscos que essa vulnerabilidade apresenta e tomar medidas para prevenir sua exploração.
A implementação de melhores práticas de segurança, como o uso de Prepared Statements e o uso de bibliotecas de segurança, pode ajudar a proteger aplicações em Java, JavaScript e Python contra a Injeção de SQL.
Não deixe de utilizar ferramentas de testes de segurança automatizadas durante todo o ciclo de vida de desenvolvimento em seus processos.