Pergunta

Am atualmente trabalhando em um aplicativo que requer que os usuários enviem mensagens e comentários que é exibido no site. Como todos nós sabemos que a entrada do usuário não pode ser confiável, então eu utilizado htmlspecialchars ($ string, ENT_QUOTES) para posts e comentários do usuário processo.

Agora, eu quero algumas determinadas tags HTML ignorados. tais como <b><br /> e mais algumas tags. Como posso fazê-lo de modo que htmlspecialchars ignora algumas tags ao mesmo tempo que filtra os outros.

Foi útil?

Solução

Solução a)
uso strip_tags insted de htmlspecialchars e whitelist as tags necessárias.
melhor solução b)
Use bbcodes e dar apelidos para as tags queriam, p.ex.: [b] negrito [/ b]

Outras dicas

É muito, muito difíceis Para permitir que apenas algumas tags HTML sem permitir qualquer possibilidade de injeção de script ou similar.

Eu realmente recomendo evitar este e usando algo que gera HTML, como este código UBB analisador (ou semelhante). Ou mesmo Markdown (com opção HTML desligado).

Isso dá nenhum espaço para os atacantes para bater o seu site, que é muito importante se ele é voltado para o público.

Se você permitir que até mesmo alguns HTML através, as chances são de que um determinado atacante vai encontrar uma maneira de contornar isso.

Cansado de usar BBCode devido ao panorama atual de filtros HTML deficientes ou inseguras
-> HTML Purifier

HTML Purifier é uma biblioteca de filtro de HTML compatível com os padrões escritas em PHP. HTML Purifier não só irá remover todos os códigos maliciosos (mais conhecido como XSS) com um exaustivamente auditado, garantir whitelist ainda permissiva, ...

Você pode substituir a string para re-inserir as tags permitidos. Para tags <b> por exemplo:

$string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string);

Eu só permitiria muito distintas, marcas completos para ser o mais seguro possível. Ou seja, Não use expressões regulares se você não tem que, ele pode levar a erros muito desagradáveis.

Eu fortemente recomendo que você use Zend_Filter para filtrar através de entrada do usuário. Especificamente, veja: http://framework.zend.com/ manual / en / zend.filter.html # zend.filter.introduction.using

Isto não é tão simples como você pode coisa porque nem htmlspecialchars() htmlentities() fornece quaisquer opções para ignorar certos tags (ambas as funções nem sequer sabem o significado da noção de marcas ).

Você pode usar outros meios para permitir que os usuários para formatar suas mensagens, por exemplo, BBCode , Têxtil ou Markdown . Há PHP analisadores disponíveis para todos eles.

Se você tem que ficar com o código HTML que você poderia recorrer a algum pré-processamento que reformata as tags permitidos para que eles não serão afetadas por htmlspecialchars() . Você pode então postprocess o resultado para mudar de volta o formato para HTML-tags normais. Os seguintes visualiza amostra este processo para um <a>-tag simples. Por favor, esteja ciente de que o processamento de HTML com expressões regulares é propenso a erros e nem sempre o caminho a percorrer. - Vou usá-lo apenas por uma questão de simplicidade neste exemplo

$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);

Esta é testado e certamente irá exigir muito mais trabalho.

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