25 de junho de 2011  //  12 Comentários  //  Categorias: PHP, Tutoriais

Bloqueando Injections & XSS no PHP



A cada dia que passa, está mais comum e frequente os ataques de injection. A poucos dias, desenvolvi uma intranet para um cliente e pelo logs do banco de dados, descobri que fui vítima de um ataque de injection SQL.

A minha sorte foi que o usuário que realiza a conexão com o banco de dados tinha somente permissão de leitura, pois o sistema apenas gerava relatórios. ^^’

Injection e XSS são uma vulnerabilidade que permite ao atacante enviar um código malicioso para uma determinada página na internet. Neste caso, o script será executado no contexto da página, permitindo ao atacante realizar algumas operações desastrosas como: embutir uma rotina JavaScript, PHP ou uma query SQL.

Como se proteger?

Para blindar a sua página contra esse tipo de ataque, basta você verificar e filtrar todas as entradas recebidas em $_GET e $_POST, afim de eliminar qualquer tag HTML, PHP ou SQL. Por exemplo, eliminando tags HTML:

Em sua grande maoria, este tipo de cuidado passa despercebido devido aos prazos apertados e o tamanho do sistema que está sendo desenvolvido. Contudo, criei uma classe classe que automaticamente filtra todos os valores passados via $_GET ou $_POST contra injections HTML, JavaScript, PHP e SQL, e é óbvio, estou disponibilizando para vocês!

Para ativar, de forma bem simples, basta chamar a função filterInjection() passando os array $_GET e/ou $_POST.

Exemplo

Quer copiar esse post no seu site? Você pode!

Segundo a licença da Creative Commons 3.0 (CC BY SA 3.0) você pode copiar e distribuir esse conteúdo desde que faça menção ao autor original, para isso é só copiar esse código no final do artigo quando for publicá-lo em seu site:

<p>Artigo originalmente publicado em <em>25 de junho de 2011</em> por <strong><a href="http://pedroelsner.com/" title="Pedro Elsner, Profissional de TI - São Paulo">Pedro Elsner</a></strong>: <a href="http://pedroelsner.com/2011/06/bloqueando-injections-xss-no-php/" title="Bloqueando Injections & XSS no PHP">Bloqueando Injections & XSS no PHP</a></p>
A não menção ao autor original da obra implicará em cópia e/ou distribuição ilegal de propriedade intelectual, o que é crime segundo a Lei n.º 9.610.
  • Thiago

    Muito interessante este post. Posso coloca-lo em meu blog?

  • Pedro Elsner

    Claro! Basta você colocar que este post foi originalmente publicado por mim. Abraços!

  • Claro! Basta você colocar que este post foi originalmente publicado por mim. Abraços!

  • Rafael Wendel Pinheiro

    Fala Pedro, otimo post.

    Só uma duvida, tenho um form back-end para inserção de noticias com um editor. Esse editor é capaz de gerar conteudo HTML automaticamente para formatar a noticia e etc.

    Pergunta: vou perder minha formatação caso use sua classe?

    Parabens pelo blog.

    Abs.
     

  • Beleza Rafael?

    Vai perder sim! A idéia é essa mesmo, remover todos os códigos HTML enviados via POST ou GET. Porém há campos em que você não quer que seja aplicado esse filtro, por isso modifiquei a classe incluindo métodos para verificar apenas SQL Injection ou em apenas um campo específico.

    Outra possíbilidade – e a mais recomendada – é você utilizar shortcodes neste campo, por exemplo você define [b] para negrito e quando for exibir faz o replace para o códigio Html. Existe uma classe chamada BBCode que é muito utilzada para isso. Neste link tem um tutorial muito bom: http://mndti.com/tutoriais/43-bbcode-php-criando-e-implantando-em-seu-site-ou-sistema

  • Guilherme

    não está funcionando amigo :/

    PHP Fatal error: Cannot redeclare AntiXssClass::filterFieldSqlInjection() in ………/anti_xss_class.php on line 67

  • Sorry Guilherme =(
    Corrigi o bug da classe.
    Agora é só baixar novamente. =D

  • Lucas ☕️

    Nossa cara, obrigado mesmo! Ajudou bastante :D!

  • Wanderson

    Pedro, em caso de tentativa de injeção de codigo Java Script, a função htmlspecialchars trata os caracteres me JS ? pois a strip_tags nao … a function htmlentities nao seria melhor no lugar da htmlspecialchars ? pois apesar delas nao tratarem o JS o htmlentities converte todos os caracteres especiais em html equivalente… Obrigado!

  • Alexandre

    Parabéns pelo post.

  • Jean

    Onde esta o arquivo para baixar sobre Bloqueando Injections & XSS no PHP

    Não achei, foi retirado?

  • Luan Martins

    Não conseguir usar, tem como me ajudar? Eu sou novo na area, e estou bastante preocupado com a proteção dos formularios, eu não entendi como faço para usar a class.

    eu chamo ela com o require;

    eu criei tudo direitinho fiz a class, chamei ela na pagina desejada, e coloquei os metodos, porem retornou varios erros.