O que é Cross-site Scripting “XSS” e como posso proteger o meu site / aplicação contra esse tipo de ataque?
Basicamente o Cross-site Scripting explora uma “simples” vulnerabilidade causada pela falta de um filtro nos inputs dos usuários.
Os dados armazenados no banco de dados não são devidamente filtrados, dessa forma é permitido que o usuário salve um código Javascript invés de uma String, que é o valor esperado.
Exemplo de XSS
Digite um código JS no campo abaixo: Ex “ alert(10001); “.
…
Vardump da variável “test”:
Nada foi encontrado na variável POST:NULL
…
No exemplo acima, além do var_dump da variável, estou utilizando o echo para exibir o conteúdo na página.
E é exatamente ai que ocorre a falha de segurança, permitindo que um script seja incluso na minha página sem nenhum filtro.
Imagine agora que o valor enviado acima fosse salvo no banco, como um “comentário” de um usuário.
Facilmente o agressor poderia criar um redirecionamento da página contendo a listagem de comentários para o seu site utilizando:
<script>location.href='http://rogertakemiya.com.br';</script>
Aonde o código acima é enviado no INPUT que é destinado ao comentário real.
Cross Site Scripting como evitar
Em cada linguagem de programação existirá funções nativas que irão fornecer um filtro para remover HTML e Javascript.
É muito importante que você filtre qualquer tipo de dado fornecido pelos usuários do seu sistema, tanto no momento que você for salvar no banco de dados, como também quando você for exibi-los.
XSS pode causar um grande transtorno para você e danificar permanentemente a reputação do seu site ou sistema.
No PHP:
Você pode utilizar a função htmlspecialchars nos valores antes de salvar no banco de dados e quando for exibi-los
htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
ASP.NET
Microsoft tem um artigo dedicado a como filtrar sua aplicação contra XSS.
https://docs.microsoft.com/en-us/aspnet/core/security/cross-site-scripting
Python
from jinja2 import utils str(utils.escape('texto a ser validado'))
Java JSP
/* exemplos em JSP */ <p><c:out value="${bean.userControlledValue}"></p> <p><input name="test" value="${fn:escapeXml(param.paramtest)}"></p>
Conclusão
Independente da linguagem que for utilizada é interessante você utilizar uma função “global” por onde passa todos os valores que são enviados e salvos pelos os usuários.
Dentro dessa função, você aplica os filtros que forem necessários utilizando as funções nativas ou bibliotecas.
Dessa forma, sempre que você precisar adicionar um novo filtro ou atualizar uma função que ficou “outdated” você não precisará revisar todo o seu código fonte.
Bom desenvolvimento! 😉