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 ‘<’ e ‘>’. 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() --> <script></script> |
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' sé ' 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.
Fora de tópico Mostrar Código Esconder Código Mostrar EmoticonEsconder Emoticon