Pergunta

Eu preciso implementar um simples e eficiente filtro XSS em C ++ para CppCMS . Eu não pode usar filtros de alta qualidade existente escrito em PHP porque porque é framework de alto desempenho que usa C ++.

A idéia básica é fornecer um filtro que tem uma lista, enquanto de HTML tags e um branco lista de opções para essas tags. Por exemplo. input HTML típico pode consistir em <b>, <i>, tags e tag <a> com href. Mas implementação direta não é bom o suficiente, porque, links simples, mesmo autorizados podem incluir XSS:

<a href="javascript:alert('XSS')">Click On Me</a>

Há muitos outros exemplos podem ser encontrados . Então eu embora também sobre a possibilidade de criar uma lista branca de prefixos para marcas como href / src - então eu sempre preciso verificar se ele começa com (https?|ftp)://

Perguntas:

  • São estes pressupostos são bons o suficiente para a maioria dos fins? O que significa que se eu não Dê um opções para tags style e verificar src / href usando lista branca de prefixos que resolve problemas de XSS? Existem problemas que não podem ser corrigidos neste caminho?
  • Existe uma referência boa para gramática formal de HTML / XHTML para escrever simples parser que a limpeza todos incorreta de marcas proibidas como <script>
Foi útil?

Solução

Você pode dar uma olhada no projeto Anti Samy, tentando fazer a mesma coisa. É Java e .NET embora.

Editar 1, um pouco mais:

Você pode potencialmente vir para cima com uma lista branca muito rigoroso. Deve ser estruturado bem e deve ser muito apertado e não muito flexível. Quando você combina flexibilidade, tantas marcas, atributos e diferentes navegadores geralmente você acabar com uma vulnerabilidade de XSS.

Eu não sei o que é suas necessidades, mas eu iria com um rigoroso e simples suporte tag (apenas b li h1 etc.) e, em seguida, suporte atributo estrita baseada na tag (por exemplo src só é válida sob href tag), então você precisa fazer whitelisting nos valores de atributos como você disse http | https | ftp ou style =. "cor | background-color" etc

Considere este:

<x style="express/**/ion:(alert(/bah!/))">

Além disso, você precisa pensar sobre algum personagem whitelisting ou algum UTF-8 normalização, porque codificações diferentes pode causar problemas difíceis. Tal como novas linhas em atributos, válidos UTF-8 sequências não.

Outras dicas

Todos os detalhes do HTML parsing são especificado em HTML 5 . No entanto implementação é bastante um monte de trabalho, e não importa se você vai analisar HTML exatamente com todos os casos de canto. Na pior das hipóteses você vai acabar com DOM diferente, mas você tem que DOM sanitize qualquer maneira.

Como você mencionou, existem várias implementações de PHP deste, mas eu não sei de nenhum em C ++, uma vez que não é uma linguagem tipicamente aplicada ao desenvolvimento web. No geral, ele vai depender de quão complexo de uma implementação você quiser chegar a.

Um muito restritiva whitelist é provavelmente a maneira "mais simples", mas se você quiser ser realmente abrangente Gostaria de olhar para fazer uma conversão de uma das versões estabelecidas para C ++, ao contrário de tentar escrever o seu próprio a partir do zero. Há tantos truques para se preocupar, que eu acho que você seria melhor fora de pé sobre os ombros de outros que já passaram por tudo isso.

Eu não sei nada sobre o uso de C ++ para desenvolvimento web, mas convertendo PHP para não parecer que seria uma tarefa particularmente difícil, PHP realmente não tem quaisquer capacidades mágicas que C ++ não será capaz duplicar. Estou certo de que haverá alguns pequenos contratempos, mas no geral, se você quiser ir a rota mais complexo que ia definitivamente ainda ser mais rápido para fazer uma conversão do que um projeto completo a partir do zero.

HTML Purifier parece ser uma forte implementação PHP que ainda é mantido ativamente, há a documento de comparação, onde o autor discutir algumas diferenças entre a sua abordagem ea dos outros, provavelmente vale a pena a leitura.

O que quer que você venha com, definitivamente testá-lo com todos os exemplos que apontam, e certifique-se que ele passa todos aqueles. Boa sorte!

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