Injeção de SQL ( SQLi )

Mar 12 2023
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 de App Sec e Desenvolvimento de Software e muita leitura e codificação segura. Neste artigo, tentarei simplificar o conteúdo no básico.
Vamos aprender juntos | Injeção SQL

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 -

  1. 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.
  2. 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