https://github.com/diovanas/sql-injection
Repositório explicativo sobre o ataque SQL Injection, com exemplos de código demonstrando o cenário de vulnerabilidade e a sua solução.
https://github.com/diovanas/sql-injection
java sql
Last synced: 11 months ago
JSON representation
Repositório explicativo sobre o ataque SQL Injection, com exemplos de código demonstrando o cenário de vulnerabilidade e a sua solução.
- Host: GitHub
- URL: https://github.com/diovanas/sql-injection
- Owner: DiovanaS
- Created: 2024-04-04T01:58:47.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-04-04T02:31:20.000Z (about 2 years ago)
- Last Synced: 2025-03-02T18:24:11.300Z (over 1 year ago)
- Topics: java, sql
- Homepage:
- Size: 4.88 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
### O que é SQL Injection?
SQL Injection é uma técnica de ataque que explora vulnerabilidades em sistemas que interagem com bancos de dados SQL.
O ataque ocorre quando um invasor insere instruções SQL maliciosas em campos de entrada de um formulário web ou parâmetros de URL, manipulando assim a execução das consultas SQL pelo banco de dados.
### Código vulnerável
O código abaixo é de uma aplicação Java capaz de consultar produtos de uma base de dados SQL.
```java
import java.sql.*;
public class SusceptibleToSQLInjection {
public static void main(String[] args) {
// Termo de pesquisa fornecido pelo usuário, potencialmente malicioso
String termoPesquisa = "'; DROP TABLE produtos;--";
// Dados de conexão com o banco de dados
String url = "jdbc:mysql://localhost:3306/database";
String user = "root";
String pass = "password";
try {
// Estabelece conexão com o banco de dados
Connection conn = DriverManager.getConnection(url, user, pass);
// Criação de uma instrução SQL utilizando concatenação de strings
Statement stmt = conn.createStatement();
String query = "SELECT * FROM produtos WHERE nome='" + termoPesquisa + "'";
// Execução da consulta SQL
ResultSet rs = stmt.executeQuery(query);
// Exibicação do resultado da pesquisa
while (rs.next()) {
String nomeProduto = rs.getString("nome");
System.out.println("Produto encontrado: " + nomeProduto);
}
// Fecha a conexão com o banco de dados
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
### Solução
Para solucionar o problema, utiliza-se o PreparedStatement, ao invés de concatenar o termo de pesquisa diretamente na consulta SQL, .
Com o PreparedStatement, o termo de pesquisa é tratado como um valor de parâmetro e é inserido na consulta usando um marcador de posição (?).
Quando o PreparedStatement é executado, o valor do parâmetro é substituído no local do marcador de posição.
Isso impede que o termo de pesquisa fornecido pelo usuário seja interpretado como parte da estrutura da consulta SQL, eliminando assim a vulnerabilidade de SQL Injection.
```java
import java.sql.*;
public class SafeFromSQLInjection {
public static void main(String[] args) {
// Termo de pesquisa fornecido pelo usuário, potencialmente malicioso
String termoPesquisa = "'; DROP TABLE produtos;--";
// Dados de conexão com o banco de dados
String url = "jdbc:mysql://localhost:3306/database";
String user = "root";
String pass = "password";
try {
// Estabelece conexão com o banco de dados
Connection conn = DriverManager.getConnection(url, user, pass);
// Criação de uma consulta parametrizada utilizando PreparedStatement
String query = "SELECT * FROM produtos WHERE nome=?";
PreparedStatement pstmt = conn.prepareStatement(query);
// Define o valor do parâmetro usando setString(), o que previne SQL Injection
pstmt.setString(1, termoPesquisa);
// Execução da consulta SQL
ResultSet rs = pstmt.executeQuery();
// Exibicação do resultado da pesquisa
while (rs.next()) {
String nomeProduto = rs.getString("nome");
System.out.println("Produto encontrado: " + nomeProduto);
}
// Fecha a conexão com o banco de dados
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```