Como evitar ataques XSS e SQL Injection

Evitar ataques XSS e SQL Injection

Evitar ataques XSS e SQL Injection

Com a procura das empresas para migrarem para a Web, a quantidade de sites disponível está crescendo cada vez mais, isso é fato, até porque, o número de IP’s IPv4 já estão se esgotando, e as gigantes da web como Google, Facebook e Yahoo já começaram seus testes para IPv6, que para nós, usuários, não afetará em nada diretamente.
Com o crescimento dos sites, e não só com isso, a lista de sites vulneráveis que existe é bem extensa, na maioria das vezes por desconhecimento do programador. Neste artigo vou falar sobre duas, uma envolve a parte do cliente (XSS) e a outra o servidor, logo o banco de dados (SQL Injetcion). Here we go!

XSS – Cross-site scripting ou Client-side scripting

XSS está ligado diretamente a javascript. Hoje, creio que mais de 90% dos navegadores no mundo estão com o javascript habilitado, então são muitos os usuários que estão expostos a este tipo de ataque. O XSS geralmente é utilizado para roubar informações pessoais dos usuários, como cookies e sessões, onde podem estar armazenados dados importantes, como logins e senhas.
Para o XSS ser executado o navegador do usuário deverá “ler” o código injetado e assim executar direta ou indiretamente o script. Geralmente esses códigos são enviados através de uma entrada de dados e armazenado em um banco de dados, e quando é requisitado a saída desses dados, o usuário pode ser a vítima. Isso pode ser evitado filtrando os dados gastando mais algumas 1 ~ 3 linhas de códigos, por exemplo, um código javascript precisa estar dentro das tags <script></script> para ser executado, então na hora de inserirmos estes dados em algum banco de dados substituimos os caracteres ‘<’ e ‘>’ por código HTML, respectivamente ‘&lt;’ e ‘&gt;’. Em php podemos filtrar dados assim utilizando a função htmlentities().
Esta função converte caracteres desse tipo para entities do HTML, fácil, não?
Então quando o usuário requisitar esses dados o que será mostrado ficaria assim:
?
1
2
3
4
5
<!-- O que será mostrado para o usuário -->
<script></script>
<!-- O que será escrito no HTML utilizando a função htmlentities() -->
&lt;script&gt;&lt;/script&gt;
Simples, fácil e rápido. Sabemos que nenhum sistema é 100% seguro, o que na maioria das vezes é dificultar e melhorar a segurança para que os sistemas não sejam invadidos. Veja alguns casos reais:
  • Caso do Twitter com XSS
  • Skype para iOS
Alguns outros casos que isso pode acontecer é em fóruns, ou algum serviço de um determinado site que ofereça troca de mensagens, bate-papo, etc. Algumas alternativas que a maioria dos fóruns fazem é substituir os caracteres ‘<’ e ‘>’ por ‘[' e ']‘, respectivamente.
Algumas funções PHP que pode ser usadas para evitar:
  • htmlspecialchars()
  • filter_var()
  • htmlentitites()

SQL Injection

Acho que o ataque mais conhecido contra banco de dados é o SQL Injection. O que ele faz é muito simples, injeta um código SQL em alguma entrada de dados sem filtragem dos mesmos. Por exemplo, alguma URL que passe parâmetros via GET, formulários de cadastros onde não validem os campos, etc.
E a mesma coisa serve para o SQL Injection, algumas linhas de código a mais e você tem um sistema mais seguro.
Para testarmos se um parametro ou campo é vulnerável deveremos inserir uma query para forçar um erro, caso aparece mensagens de erro do banco de dados utilizado, possivelmente o site está vulnerável a ataques, mas lembre-se, nenhum sistema é 100% seguro, o próprio site do MySQL foi hackeado utilizando SQL Injection. Há formas de prevenção, devemos dificultar o acesso a essas falhas de segurança.
Geralmente para fazer os testes de vulnerabilidade, utiliza-se um comando forçando um erro, como uma aspa no lugar errado, ou algo assim, digamos que estamos tentando verificar se um parametro GET é vulnerável, então testamos assim:
?
1
SELECT id, nome, sobrenome FROM autores WHERE nome = 'jo'' AND sobrenome = 'silva';
Se com isso conseguimos descobrir se o site é vulnerável, podemos simplesmente executar um DELETE, ou DROP TABLE, e pronto, todo o banco de dados está comprometido, por isso é muito bom mantermos um backup desses dados.

E como se prevenir?

Existem algumas funções para isso, em qualquer linguagem podemos utilizar expressões regulares para fazer uma verificação dos dados e barrar o script caso encontre palavras chaves como SELECT, DROP, DELETE, FROM, *, WHERE, etc.
Outra forma de se prevenir é colocando barras invertidas em aspas, ou seja, quando o script encontra uma aspa seja simples ou dupla, ele adiciona uma barra invertida ‘\’ nessa aspa, então nossa query ficaria assim:
?
1
SELECT id, nome, sobrenome FROM autores WHERE nome = \'jo\'sé\' AND sobrenome = \'silva\';
Esses são alguns exemplos que você pode utilizar para prevenção de SQL Injection, seja em PHP, Java, C#, JSP, ou qualquer outra linguagem, são conceitos que podemos utilizar em várias linguagens. Em PHP podemos utilizar funções como:
  • mysql_real_scape_string()
  • addslahes()
Uma apresentação feita por gilmaik - Construindo uma aplicação PHP à prova de balas. Também recomendo a leitura das suas outras apresentações.
Obrigado pelo seu comentário

Postagens Relacionadas

Related Posts Plugin for WordPress, Blogger...

Programador GB