Como todos sabemos até agora, os ataques XSS são perigosos e muito fáceis de realizar . Várias estruturas facilitam a codificação de HTML, como o ASP.NET MVC:
<%= Html.Encode("string"); %>
Mas o que acontece quando seu cliente exige que ele possa fazer upload de seu conteúdo diretamente de um documento do Microsoft Word?
Aqui está o cenário: as pessoas podem copiar e colar conteúdo do Microsoft word em um editor WYSIWYG (neste caso, tinyMCE ), e essas informações são postadas em uma página da web.
O site é público, mas apenas os membros dessa organização terão acesso para postar informações em uma página da web.
Como faço para lidar com esses requisitos de forma segura? Atualmente, não há verificação feita no que o cliente publica (já que apenas usuários 'confiáveis' podem postar), mas não estou particularmente satisfeito com isso e gostaria de bloqueá-lo ainda mais caso uma conta seja invadida.
O único método conceitual que eu conheço que atende a esses requisitos é colocar na lista branca as tags HTML e permitir que elas passem . Existe outro caminho? Caso contrário, qual é a maneira segura de permitir que o usuário armazene entrada no Banco de Dados de qualquer forma, mas apenas a exiba adequadamente codificada e sem tags ruins?
Pergunta relacionada
fonte
Respostas:
A maneira mais fácil (para você como desenvolvedor) é provavelmente implementar uma das muitas variações do Markdown , por exemplo, o Markdown.NET ou, ainda melhor (imho), um editor wmd .
Em seguida, seus usuários poderão colar HTML simples, mas nada perigoso, e poderão visualizar os dados inseridos e endireitar quaisquer escrúpulos antes mesmo de postar ...
fonte
A lista de permissões é realmente a melhor maneira de impedir ataques XSS ao permitir que os usuários insiram HTML, diretamente ou usando um Editor de Rich Text.
Sobre suas outras perguntas:
Eu não acho que isso poderia funcionar. Você precisa do código do lado do servidor para isso e o RTE é executado no cliente.
O TinyMCE filtra as tags, se você quiser, mas como isso ocorre no navegador, você não pode confiar nela. Consulte extended_valid_elements . O TinyMCE (Moxie) também sugere a lista de permissões, veja aqui .
Você deve sempre filtrar o HTML, a menos que haja motivos específicos para não (muito raro). Alguns motivos: a) funcionalidade destinada a usuários internos hoje, talvez para o público de amanhã; b) o acesso não autorizado terá menos impacto
É assim que eu prefiro. Não gosto de alterar a entrada do usuário antes de inseri-lo no banco de dados por vários motivos.
fonte
Estou fazendo a mesma coisa. Estou usando o TinyMCE e permitindo colar documentos do Word. Somente certas pessoas que mantêm o site podem fazer isso por meio de uma área administrativa. Isso é garantido pela associação do ASP.Net. Eu sou simples fazendo o HTML.Encode quando ele é enviado para o site público.
Você pode usar o código abaixo, se quiser, antes de ser colocado no banco de dados, mas não sabe ao certo o que isso causaria. Você pode ter que ir com sua lista de permissões.
fonte
Uma opção pode ser o HTML Edit Control for .NET (que escrevi).
É um editor de HTML WYSIWYM para .NET, que suporta apenas um subconjunto dos elementos HTML , excluindo
<script>
elementos: dessa forma, ele atua como uma lista de permissões.Se for para uso interno (por exemplo, um site da intranet), o controle poderá ser incorporado em uma página da web .
Não integrei suporte para colar do Word, mas tenho um componente que é um passo nessa direção: um conversor de Doc para HTML ; então eu tenho os blocos de construção que você pode usar no ASP.NET para converter um documento em HTML, exibir o HTML no editor etc.
fonte
Meu IMHO continua confiando em seus usuários até que você se torne público.
Bem, não há uma maneira confiável de atender às suas necessidades. Por exemplo, qualquer editor WYSIWYG falha ao proteger a inserção de imagens com URLs (faixa de uso indireto, conteúdo ilegal) ou texto (texto ilegal, texto incorreto, texto incorreto).
Meu ponto de vista é que, se você pode confiar nos seus usuários, simplesmente permita tudo, apenas avise os usuários se houver uma marcação perigosa do KNOW (para evitar erros).
Se você não confiar, use um tipo de marcação especial (por exemplo, Markdown).
No meu projeto, usamos tipos especiais para conteúdo potencialmente perigoso e métodos especiais para renderizar e aceitar esse conteúdo. Esse código tem uma pontuação alta em nosso modelo de encadeamento e sua atenção é muito alta (por exemplo, cada alteração deve ser revisada por dois codificadores independentes, temos um conjunto de testes abrangente e assim por diante).
fonte