Coloque uma postagem cruzada como uma referência consolidada da versão beta da Documentação do SO, que ficará offline.
Problema
O script entre sites é a execução não intencional de código remoto por um cliente da Web. Qualquer aplicativo da Web pode se expor ao XSS se receber entrada de um usuário e enviá-lo diretamente em uma página da Web. Se a entrada incluir HTML ou JavaScript, o código remoto poderá ser executado quando esse conteúdo for renderizado pelo cliente da web.
Por exemplo, se um lado de terceiros contiver um arquivo JavaScript:
// http://example.com/runme.js
document.write("I'm running");
E um aplicativo PHP gera diretamente uma string passada para ele:
<?php
echo '<div>' . $_GET['input'] . '</div>';
Se um parâmetro GET desmarcado contiver <script src="http://example.com/runme.js"></script>
, a saída do script PHP será:
<div><script src="http://example.com/runme.js"></script></div>
O JavaScript de terceiros será executado e o usuário verá "Estou executando" na página da web.
Solução
Como regra geral, nunca confie na entrada de um cliente. Todo valor GET, POST e cookie pode ser qualquer coisa e, portanto, deve ser validado. Ao emitir qualquer um desses valores, escape-os para que não sejam avaliados de maneira inesperada.
Lembre-se de que, mesmo nos aplicativos mais simples, os dados podem ser movidos e será difícil acompanhar todas as fontes. Portanto, é uma prática recomendada sempre escapar à saída.
O PHP fornece algumas maneiras de escapar da saída, dependendo do contexto.
Funções de filtro
As funções de filtro do PHPs permitem que os dados de entrada no script php sejam higienizados ou validados de várias maneiras . Eles são úteis ao salvar ou enviar a entrada do cliente.
Codificação HTML
htmlspecialchars
converterá quaisquer "caracteres especiais HTML" em suas codificações HTML, o que significa que eles não serão processados como HTML padrão. Para corrigir nosso exemplo anterior usando este método:
<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
Saída:
<div><script src="http://example.com/runme.js"></script></div>
Tudo dentro da <div>
tag não será interpretado como uma tag JavaScript pelo navegador, mas como um simples nó de texto. O usuário verá com segurança:
<script src="http://example.com/runme.js"></script>
Codificação de URL
Ao gerar uma URL gerada dinamicamente, o PHP fornece a urlencode
função para gerar URLs válidas com segurança. Portanto, por exemplo, se um usuário puder inserir dados que se tornem parte de outro parâmetro GET:
<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
Qualquer entrada maliciosa será convertida em um parâmetro de URL codificado.
Usando bibliotecas externas especializadas ou listas OWASP AntiSamy
Às vezes, você deseja enviar HTML ou outro tipo de entrada de código. Você precisará manter uma lista de palavras autorizadas (lista branca) e não autorizadas (lista negra).
Você pode baixar listas padrão disponíveis no site da OWASP AntiSamy . Cada lista é adequada para um tipo específico de interação (ebay api, tinyMCE, etc ...). E é de código aberto.
Existem bibliotecas para filtrar HTML e impedir ataques XSS para o caso geral e para executar pelo menos as listas AntiSamy com uso muito fácil. Por exemplo, você tem purificador HTML