{"id":20109010,"url":"https://github.com/diovanas/sql-injection","last_synced_at":"2025-08-08T19:05:02.129Z","repository":{"id":231435948,"uuid":"781767401","full_name":"DiovanaS/sql-injection","owner":"DiovanaS","description":"Repositório explicativo sobre o ataque SQL Injection, com exemplos de código demonstrando o cenário de vulnerabilidade e a sua solução.","archived":false,"fork":false,"pushed_at":"2024-04-04T02:31:20.000Z","size":5,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-02T18:24:11.300Z","etag":null,"topics":["java","sql"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DiovanaS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-04-04T01:58:47.000Z","updated_at":"2024-10-23T23:01:24.000Z","dependencies_parsed_at":"2024-04-04T02:55:17.855Z","dependency_job_id":null,"html_url":"https://github.com/DiovanaS/sql-injection","commit_stats":null,"previous_names":["diovanas/sql-injection"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/DiovanaS/sql-injection","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiovanaS%2Fsql-injection","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiovanaS%2Fsql-injection/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiovanaS%2Fsql-injection/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiovanaS%2Fsql-injection/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DiovanaS","download_url":"https://codeload.github.com/DiovanaS/sql-injection/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiovanaS%2Fsql-injection/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269474785,"owners_count":24423102,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-08T02:00:09.200Z","response_time":72,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","sql"],"created_at":"2024-11-13T18:06:52.180Z","updated_at":"2025-08-08T19:05:02.077Z","avatar_url":"https://github.com/DiovanaS.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"### O que é SQL Injection?\n\nSQL Injection é uma técnica de ataque que explora vulnerabilidades em sistemas que interagem com bancos de dados SQL. \nO 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.\n\n\n\n### Código vulnerável\n\nO código abaixo é de uma aplicação Java capaz de consultar produtos de uma base de dados SQL.\n\n```java\nimport java.sql.*;\n\npublic class SusceptibleToSQLInjection {\n    public static void main(String[] args) {\n        // Termo de pesquisa fornecido pelo usuário, potencialmente malicioso\n        String termoPesquisa = \"'; DROP TABLE produtos;--\";\n\n        // Dados de conexão com o banco de dados\n        String url = \"jdbc:mysql://localhost:3306/database\";\n        String user = \"root\";\n        String pass = \"password\";\n\n        try {\n            // Estabelece conexão com o banco de dados\n            Connection conn = DriverManager.getConnection(url, user, pass);\n            \n            // Criação de uma instrução SQL utilizando concatenação de strings\n            Statement stmt = conn.createStatement();\n            String query = \"SELECT * FROM produtos WHERE nome='\" + termoPesquisa + \"'\";\n            \n            // Execução da consulta SQL\n            ResultSet rs = stmt.executeQuery(query);\n\n            // Exibicação do resultado da pesquisa\n            while (rs.next()) {\n                String nomeProduto = rs.getString(\"nome\");\n                System.out.println(\"Produto encontrado: \" + nomeProduto);\n            }\n\n            // Fecha a conexão com o banco de dados\n            conn.close();\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n}\n```\n\n\n\n### Solução\n\nPara solucionar o problema, utiliza-se o PreparedStatement, ao invés de concatenar o termo de pesquisa diretamente na consulta SQL, . \nCom o PreparedStatement, o termo de pesquisa é tratado como um valor de parâmetro e é inserido na consulta usando um marcador de posição (?). \nQuando o PreparedStatement é executado, o valor do parâmetro é substituído no local do marcador de posição. \nIsso 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.\n\n```java\nimport java.sql.*;\n\npublic class SafeFromSQLInjection {\n    public static void main(String[] args) {\n        // Termo de pesquisa fornecido pelo usuário, potencialmente malicioso\n        String termoPesquisa = \"'; DROP TABLE produtos;--\";\n\n        // Dados de conexão com o banco de dados\n        String url = \"jdbc:mysql://localhost:3306/database\";\n        String user = \"root\";\n        String pass = \"password\";\n\n        try {\n            // Estabelece conexão com o banco de dados\n            Connection conn = DriverManager.getConnection(url, user, pass);\n            \n            // Criação de uma consulta parametrizada utilizando PreparedStatement\n            String query = \"SELECT * FROM produtos WHERE nome=?\";\n            PreparedStatement pstmt = conn.prepareStatement(query);\n            \n            // Define o valor do parâmetro usando setString(), o que previne SQL Injection\n            pstmt.setString(1, termoPesquisa);\n            \n            // Execução da consulta SQL\n            ResultSet rs = pstmt.executeQuery();\n\n            // Exibicação do resultado da pesquisa\n            while (rs.next()) {\n                String nomeProduto = rs.getString(\"nome\");\n                System.out.println(\"Produto encontrado: \" + nomeProduto);\n            }\n\n            // Fecha a conexão com o banco de dados\n            conn.close();\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiovanas%2Fsql-injection","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdiovanas%2Fsql-injection","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiovanas%2Fsql-injection/lists"}