A sua aplicação está segura a SQL injection? 🤔

Acredito que a resposta seja sim, essa vulnerabilidade já foi mais comum há alguns anos. Apesar de ser bem conhecida no meio de segurança de dados, eu tive o primeiro contato com essa vulnerabilidade na última aula que assisti no curso.dev do Filipe Deschamps. E eu achei muuuuuito massa! E como o próprio Filipe frisou, saber reconhecer e consertar esse tipo de brecha vale ouro!

SQL injection (SQLi) é uma vulnerabilidade na segurança de uma aplicação que permite a “injeção” 💉 de queries maliciosas com o objetivo de atacar o banco de dados. Uma SQL injection bem sucedida pode acarretar ao acesso não autorizado a dados sensíveis ou até mesmo ter o poder de modificar e apagar dados importantes.

No vídeo do canal NetworkChuck é citado um exemplo bem básico usando um input “username” e “password” onde depois de preencher os dados e apertar “login” a aplicação conecta com o banco de dados e roda uma query para ver se o username e password existem. Se sim, o login é bem sucedido.

E é bem aqui que podemos encontrar uma brecha! ⚠️⚠️ A query enviada para o banco de dados provavelmente é parecida com isso aqui:

SELECT * FROM users WHERE username = ‘user’ AND password=’senha’

Quando estamos codando, é comum usarmos comentários para descomplicar o código, certo? Em SQL é possível fazer isso apesar adicionando “--” e tudo que vier depois disso vai ser ignorado. No final do nosso nome de usuário “user” podemos abrir aspas e adicionar “--”, assim: user’--

E a query vai ficar dessa forma:

SELECT * FROM users WHERE username = ‘user’-- ’ AND password=’senha’

Isso significa que o “AND password=’senha’” vira comentário e é totalmente ignorado. Presumindo que exista um username = ‘user’, como o restando não vai ser processado ele só precisa desse dado e BOOM!! Login bem sucedido! Sem precisar de senha.

Não é legal?! 🤩

Isso aqui é só o básico, normalmente é bem mais complicado que isso. E apesar de ser uma forma de hack bem antiga, ainda pode ser encontrada. Por isso a importância de fazer um Query Sanitization ou Limpeza de Consulta. O lado bom é que podemos encontrar muitas bibliotecas e módulos que oferecem formas de sanitização para implementar em nosso código de forma bem fácil! Assim vamos estar tranquilos com nossas aplicações bem seguras. 😎

Fontes: https://portswigger.net/web-security/sql-injection https://www.youtube.com/watch?v=2OPVViV-GQk https://www.linkedin.com/feed/update/urn:li:activity:7151913275763417088/

Ver mais em:

Melhor exemplo (olha a gambi que tive que fazer para publicar):

Código

Sendo que user e senha não variáveis do seu código que receberam diretamente os dados vindo externamente à sua aplicação sem nenhum tratamento. Só nessas condições dá certo.

Em geral vão mandar o nome do usuário assim (se o user não aceitar tantos caracteres, pode tentar na senha, se também não der, não sei se tem solução pensada para todos os DBs, portanto ter poucos caracteres é ruim de um lado, mas pode previnir esse tipo específico de ataque, ainda pode conseguir de outra forma, então melhor fazer certo):

Isso fecha as aspas da query, e em seguida garante que será verdadeiro sempre conectando com OR ue exihge que só um lado seja verdadeiro, e 1=1 é verdadeiro, e depois usa o comentário para o resto do texto que já estava no seu código ser desconsiderado e não dar erro, ficando assim quando for executar (a senha não importa):

Pode testar. Espero não ter comido alguma bola, eu não testei :D

Espero ter ajudado. Em geral estou à disposição na plataforma (sem abusos :D)


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

legal!! essa é mais uma forma de fazer SQL injection. há uma lista de queries que podem ser usados, tanto em inputs quanto no próprio URL do site. obrigado por compartilhar!
A sua só funciona em algumas circunstâncias, e mesmo assim na forma que mostrou, não fica claro que dá para fazer a injeção, eu diria que na maioria das linguagem não dá, teria que ser uma bem esquisita que dá.
o objetivo era citar um exemplo simples mesmo, só pra mostrar o conceito. como falei no post, normalmente essas queries são muitos mais complexas. além disso, todos os exemplos usados nesse post foi retirado do vídeo do [NetworkChuck](https://youtu.be/2OPVViV-GQk?feature=shared) caso queira dar uma olhadinha na fonte, o vídeo é excelente e explica de forma bem simples e direta. ele também cita um exemplo usando OR 1=1 mas eu resolvi compartilhar apenas o último exemplo pensando no tamanho do post. mas obrigado pelo feedback maniero! acrescentou ao assunto no geral! ;)
O vídeo não é bom. Ele é simplista e tudo o que não pode com segurança é ser simplista. Mas não é trágico por isso. E de fato ele dá contexto que ajuda, seu texto não dá o mesmo contexto. Ele não mostra que o ataque vai funcionar sempre, apenas que dá para fazer alguma injeção. Mas o pior é que ele não mostra porque você pode causar isso. Ficou uma caixa mágina no vídeo dele. Tente reproduzir o que ele fala só com o que ele mostra, sem você fazer nada extra. Por isso que eu falo para as pessoas pararem de seguir *influencers* e aprender com engenheiros. Influenciadores só querem *views*, o compromisso com a relidade é de baixo a zero.
amigo, eu só queria compartilhar com o pessoal o conceito de SQL injection que eu vi pela primeira vez essa semana. meu objetivo não era dar uma aula. talvez o post, assim como a aula do Filipe no curso me incentivou a pesquisar mais sobre o assunto, também incentive outros a conhecer e procurar saber mais. por isso fiquei feliz com seu primeiro comentário, mais fontes para pesquisar!

O XKCD tem uma clássica sobre o assunto.

image