Pergunta

Eu quero evitar ataques de XSS na minha aplicação web.Eu achei que a Codificação HTML a saída pode realmente prevenir ataques de XSS.Agora, o problema é que como eu HTML codificar cada saída na minha aplicação?Eu há uma maneira de automatizar isso?

Agradeço as respostas para JSP, ASP.net e o PHP.

Foi útil?

Solução

Você não quer codificar todo o HTML, você apenas deseja HTML codificar qualquer entrada do usuário que você está emitindo.

Para o PHP: htmlentities e htmlspecialchars

Outras dicas

Uma coisa que você não deveria fazer é filtrar os dados de entrada como ele vem.Muitas vezes, as pessoas sugerem que este, pois é a solução mais fácil, mas leva a problemas.

A entrada de dados pode ser enviado para vários lugares, além de ser a saída HTML.Ele pode ser armazenado em um banco de dados, por exemplo.As regras para a filtragem de dados enviados para um banco de dados são muito diferentes as regras para a filtragem de saída HTML.Se você HTML codificar tudo na entrada, você vai acabar com HTML no seu banco de dados.(Esta é também a razão por que PHP "citações mágicas" recurso não é uma boa ideia.)

Você não pode antecipar todos os lugares que seus dados de entrada que vão viajar.A abordagem segura é preparar os dados pouco antes de enviado em algum lugar.Se você está enviando um banco de dados, escapar as aspas simples.Se você está emitindo HTML, escapar a entidades HTML.E uma vez que é enviado a algum lugar, se você ainda precisa para trabalhar com os dados, use o original onu-escapou versão.

Isso é mais trabalho, mas você pode reduzi-lo usando o modelo de motores ou bibliotecas.

Para JSPs, você pode ter seu bolo e comê-lo também, com o c:out tag, que escapa XML por padrão.Isso significa que você pode ligar às suas propriedades como matéria-prima elementos:

<input name="someName.someProperty" value="<c:out value='${someName.someProperty}' />" />

Quando ligado a uma cadeia de caracteres, nome.someProperty irá conter o XML de entrada, mas quando está sendo a saída para a página, ele será automaticamente escapou para fornecer as entidades XML.Isso é especialmente útil para ligações para a validação da página.

Uma boa maneira de eu usadas para escapar de todas as entradas do usuário está escrevendo um modificador para o smarty que escapa de todas as variáveis passadas para o modelo;exceto para aqueles que têm |unescape anexado a ele.Dessa forma, você só dê acesso em HTML para os elementos que você explicitamente conceder acesso.

Eu não tenho que modificador mais;mas sobre a mesma versão pode ser encontrada aqui:

http://www.madcat.nl/martijn/archives/16-Using-smarty-to-prevent-HTML-injection..html

No novo Django 1.0 release isso funciona exatamente da mesma maneira, jay :)

Minha preferência pessoal é diligentemente codificar nada que vem do banco de dados, camada de negócios ou para o usuário.

No ASP.Net isso é feito usando Server.HtmlEncode(string) .

A razão para codificar qualquer coisa é que mesmo as propriedades que você pode assumir ser um valor booleano ou numéricos podem conter código malicioso (Por exemplo, caixa de seleção, os valores, se for feito incorretamente pode estar chegando de volta como seqüências de caracteres.Se você não está codificá-los antes de enviar a saída para o usuário, então você tem uma vulnerabilidade).

Você pode moldar eco / imprimir etc.em seus próprios métodos que você pode usar para escapar de saída.i.e.em vez de

echo "blah";

utilização

myecho('blah');

você poderia até mesmo ter uma segunda param de que desliga escapar, se você precisar dele.

Em um projeto que tinha um modo de depuração no nosso funções de saída que fez toda a saída de texto, indo através do nosso método invisível.Em seguida, sabíamos que nada na tela NÃO TINHA escapado!Foi muito útil para rastrear aqueles safado escape bits :)

Se você realmente HTML codificar cada saída, o usuário vai ver texto sem formatação de <html>em vez de funcionamento de uma aplicação web.

EDITAR:Se você HTML codificar cada entrada, você vai ter problema de aceitar a palavra-passe externa contendo < etc..

A única maneira de realmente proteger contra este tipo de ataque é rigorosamente filtrar todas as entradas que você aceitar, especificamente (embora não exclusivamente) de áreas públicas de sua aplicação.Eu recomendo que você dê uma olhada em Daniel Morris PHP Filtragem de Classe (solução completa) e também a Zend_Filter pacote (uma coleção de classes que você pode usar para criar seu próprio filtro).

PHP é a minha linguagem de escolha quando se trata de desenvolvimento web, portanto, desculpas pelo viés na minha resposta.

Kieran.

OWASP tem uma boa API para codificar HTML de saída, quer para uso como texto HTML (por exemplo,parágrafo ou <textarea> conteúdo) ou como um valor do atributo (por exemplo,para <input> tags após a rejeição de um formulário):

encodeForHTML($input) // Encode data for use in HTML using HTML entity encoding
encodeForHTMLAttribute($input) // Encode data for use in HTML attributes.

O projeto (PHP versão) está hospedado em http://code.google.com/p/owasp-esapi-php/ e também está disponível para outras línguas, por exemplo,.LÍQUIDA.

Lembre-se que você deve codificar tudo (não só a entrada do usuário), e mais tarde possível (quando não armazenar em DB, mas quando a saída é a resposta HTTP).

Codificação de saída é de longe a melhor defesa.Validação de entrada é grande, por muitas razões, mas não 100% de defesa.Se um banco de dados torna-se infectado com XSS através de ataque (i.e.ASPROX), erro ou maldade de validação de entrada não faz nada.Codificação de saída continuará a funcionar.

houve um bom trabalho de Joel on software (fazendo errado código olhar errado eu acho, eu estou no meu telefone caso contrário, eu teria uma URL para você) que cobria o uso correto da notação húngara.A versão curta seria algo como:

Var dsFirstName, uhsFirstName : String;

Begin

uhsFirstName := request.queryfields.value['firstname'];

dsFirstName := dsHtmlToDB(uhsFirstName);

Basicamente, o prefixo de suas variáveis com algo como "nós" para inseguros de seqüência de caracteres, "ds" para o banco de dados seguro, "hs" HTML seguro.Você só quer codificar e decodificar onde você realmente precisa, não de tudo.Mas por eles usando prefixos de inferir um significado útil olhar para o seu código, você verá rapidinho se algo não está certo.E você vai precisar de codificação/decodificação de funções, de qualquer maneira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top