Injeção de SQL ( SQLi )
Olá,
Obrigado por reservar um tempo para ler a escrita - up! Eu agradeço!
O conteúdo de hoje será sobre como entender 'SQL Injection'
O conteúdo é totalmente baseado em minhas experiências e conhecimentos pessoais, interações com pessoas incríveis no espaço App Sec e Desenvolvimento de Software e muita leitura e codificação segura.
Neste artigo, tentarei simplificar o conteúdo no básico. Tenho certeza de que os leitores terão suas próprias ideias e comentários, e agradeço qualquer feedback e discussão.
As opiniões/comentários/opiniões são minhas e não do meu empregador anterior/atual.
Vamos aprender juntos!
O que é SQL Injection?
Um tipo de ataque de segurança de aplicativo em que um ator mal-intencionado insere código SQL malicioso em um campo de entrada vulnerável para acessar e manipular dados em um banco de dados. O SQLi permite ao invasor visualizar/modificar/excluir dados em um banco de dados.
Como corrigir o SQLi?
Não concatene consultas SQL e valores de entrada.
Sempre execute a validação de entrada ( minha opinião pessoal, na verdade impede muitas assinaturas maliciosas ) e siga uma das estratégias abaixo para corrigir o SQLi -
- Consultas parametrizadas: passe valores de entrada como parâmetros para instruções sql. Isso é obtido usando consultas parametrizadas. Isso evita que entradas maliciosas sejam executadas como código SQL.
- Stored Procedures: É muito melhor não ter consultas SQL sql dentro do código e movê-las para um banco de dados por meio de stored procedures.
Consultas Parametrizadas:
No exemplo de código abaixo, o nome e a passagem são passados como parâmetros para a instrução sql por meio de 'setString()' . É um método de PreparedStatement.
....
// simple basic example
// assume name and pass are obtained from some input
// conn is the connection
String sqlStatement = "SELECT * FROM userdetails WHERE name = ? AND pass = ?";
PreparedStatement stmt = conn.prepareStatement(sqlStatement);
stmt.setString(1, name);
stmt.setString(2, pass);
ResultSet rs = stmt.executeQuery();
// carry on with your logic
....
No exemplo de código abaixo, 'name' e 'location' são passados como parâmetros para o procedimento armazenado 'userDetails' via 'setString()'. É um método de CallableStatement. A saída é recebida através do parâmetro 'output' que utiliza 'registerOutParameter'. É outro método de CallableStatement.
....
// simple basic example
// Assume name and location are obtained from some input
// conn is the connection
CallableStatement stmt = conn.prepareCall("{ call userdetails(?,?,?) }");
stmt.setString(1, name);
stmt.setString(2, location);
stmt.registerOutParameter(3, java.sql.Types.INTEGER);
stmt.execute();
int output = stmt.getInt(3);
// carry on with your logic...
....
Comentários/Feedbacks são sempre bem-vindos, pois estou sempre procurando melhorar o conteúdo e ser melhor nisso.
Fonte escrita: Minha própria experiência em App Sec, parafraseando o conteúdo de vários sites online, Open AI, DALL-E, Desenvolvedor e ferramentas NLP.
Obrigado!
Me adicione no LinkedIn





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)