Pergunta

Quando você está desenvolvendo um aplicativo baseado na Web e deseja permitir texto formatado com riqueza de detalhes do usuário, você deve escolher como permitir essa entrada.Muitas linguagens de marcação diferentes foram criadas porque é indiscutivelmente mais difícil higienizar o HTML.

Quais são as vantagens e desvantagens das várias linguagens de marcação diferentes, como:

Ou, dito de outra forma, quais fatores você considera ao escolher usar uma linguagem de marcação específica.

Foi útil?

Solução

Markdown, BBCode, Têxtil, Mediawiki Markup são basicamente o mesmo conceito geral, então eu realmente agruparia isso em duas categorias: HTML e marcação de texto simples.

Html

O acordo com o HTML é que o conteúdo já está em um formulário "apresentável" para conteúdo da Web. Isso é ótimo, economiza tempo de processamento e é uma linguagem prontamente capaz de parecer. Existem dezenas de bibliotecas em praticamente qualquer idioma para lidar com o conteúdo HTML, converter para/de HTML para outros formatos, etc. A principal desvantagem é que, devido aos padrões frouxos dos primeiros dias da web, o HTML pode ser incrivelmente variável e você pode Sempre depende da entrada sã ao aceitar HTML dos usuários. Como apontado, a arrumação ou a Santizing HTML geralmente é muito difícil, especialmente porque não segue as regras normais de marcação da maneira como o XML é (ou seja, tags fechadas indevidamente são comuns).

Marcação de texto simples

Esta categoria é frequentemente usada pelos seguintes motivos:

  • Fácil de analisar em várias formas de uma fonte - pdf, html, rtf
  • O conteúdo é armazenado em texto simples legível (geralmente muito mais fácil de ler do que o HTML bruto), se necessário, em uma data posterior, em vez de precisar extrair do HTML
  • Segue regras específicas definidas em que o HTML pode ser uma variável irritante e não estruturada
  • Permite forçar um subconjunto de formatação de conteúdo que é mais apropriado em muitos casos do que simplesmente permitir HTML completo
  • Além de forçar um subconjunto de HTML, facilita a higienização da entrada e a prevenção de problemas de script de script do local, etc.
  • Manter os dados "RAW" em um formato abstraído significa que, posteriormente, se você, por exemplo, quisesse converter seu site de HTML 4 para XHTML, você só precisa alterar o código de análise. Com a entrada do usuário formatada em HTML, você está preso agora que está tendo que converter todo o HTML em XHTML individualmente, o que, como mostra o HTML Tidy, nem sempre é uma tarefa simples. Da mesma forma, se um novo idioma de marcação ocorre em algum momento ou você precisar passar para um formato alternativo (RTF, PDF, Tex), um subconjunto restrito abstrrado de opções de formatação de texto torna essa tarefa muito mais simples.

Resumindo a linha inferior para para que a entrada do usuário está sendo usada. Se você planeja manter os dados e pode precisar embaralhar os formatos etc., faz sentido usar um formato abstrato cuidadoso para armazenar as informações. Se você precisar trabalhar com os dados brutos manualmente por qualquer motivo, os pontos de bônus se esse formato for facilmente legível por humanos. Se você estiver exibindo apenas o conteúdo em uma página da web (ou Doc html para um relatório etc.) e não terá preocupações em convertê-lo ou à prova de futuro, é uma prática razoável armazená-lo no HTML.

Outras dicas

Jeff discutiu alguns prós e contras no codinghorror.com enquanto eles estavam nos estágios iniciais de montagem. Eu pensei que era uma leitura que vale a pena.

@netrox o banco de dados não é o problema, a saída do navegador é.

A única preocupação é a renderização final que pode ser quebrada pelo HTML inserido pelo usuário.Por exemplo, o usuário pode abrir um <li> tag, mas nunca feche-a, o que dependendo de como a página está estruturada, pode quebrar todo o layout a seguir.Ou outro exemplo, abra um <strong> tag sem fechá-la, deixando todo o conteúdo restante em negrito.

Portanto, não apenas as tags permitidas devem ser validadas, mas como exatamente você permite algumas tags, mas não outras?Porque é muito fácil evitar a análise de todas as tags HTML usando htmlspecialchars() Método PHP, por exemplo, mas quando se trata de permitir algumas das tags você terá que procurar outras formas.Existe o strip_tags() Função PHP que remove (exclui completamente) tags não permitidas, mas isso significa alterar o conteúdo do usuário de maneira ruim, impedindo que o usuário poste código simples, por exemplo (código para compartilhar/mostrar, não código para processar).

Além de quebrar o layout, você deve considerar ataques XSS, como inserir javascript no atributo href de um link, que por exemplo poderia redirecionar usuários para outro site.Veja esta longa lista de possíveis ataques XSS: https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

Como você pode ver, impedir que todas as tags HTML sejam interpretadas é muito fácil, mas impedir apenas algumas tags é muito mais complicado.Para entender isso, você poderia dar uma olhada no enorme "Purificador HTML" cuja única finalidade é permitir algumas tags HTML e garantir que o HTML gerado seja válido (ou seja,não quebrará a página) e livre de ataques XSS.

"Muitos idiomas de marcação diferentes foram criados porque é indiscutivelmente mais difícil higienizar o HTML".

Sério? Como é difícil? Existem funções para remover atributos ou tags potencialmente perigosos e validar o HTML antes de inseri -lo no banco de dados ou arquivo. Você pode me dar exemplos de como é difícil higienizar o HTML?

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