O que você faz quando um cliente requer Edição Rich Text em seu site?

18

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

Impedindo XSS (Cross Site Scripting)

George Stocker
fonte
Agradável questionável aqui é um similar though- stackoverflow.com/questions/445177/...
RichardOD
Acordado. É semelhante, mas é uma pergunta confusa (a pergunta é difícil de encontrar) e não pergunta especificamente se existe outra maneira. Se houver outra maneira de renderizar HTML sem ter que usar a lista de permissões, sou totalmente a favor. Se existe um ASP.NET MVC View Engine que cuida disso, é bom saber também.
18139 George Stocker
Em uma observação não relacionada à segurança, as tags de filtragem provavelmente serão úteis da perspectiva da interface do usuário. É muito fácil digitar acidentalmente um colchete angular e esquecer de escapar dele. Como estamos falando de usuários que estão copiando do Word, é uma boa ideia capturar o que parece ser tags ruins e codificá-las adequadamente (por exemplo, & amp; lt;) para que as coisas simplesmente funcionem.
Em relação ao ponto 4: Você aposta que ainda é um problema! A maioria dos hacks é um trabalho interno, afinal. Para um editor específico, tive boa sorte usando o FreeTextBox, mas não posso falar de como ele corresponde aos seus requisitos, especialmente ao MVC.
Joel Coehoorn
1
@ Obrigado Obrigado; editado. Parece que minha pergunta chamou a atenção de algum tipo de cabala; três votos negativos em rápida sucessão e sua solicitação de proteção e edição.
George Stocker

Respostas:

8

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 ...

Tomas Aschan
fonte
Acredito StackOverflow usar um editor personalizado, sem a necessidade de sintaxe ADM
Jon
O que você quer dizer com sintaxe WMD? Até onde eu sei, toda a sintaxe WMD funciona. E ainda não encontrei nada que não funcione ...
2
O problema com o uso do Markdown é que o markdown permite HTML arbitrário; então, por si só, não é uma solução.
George Stocker
7

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:

Existe um editor WYSIWYG que inclui a capacidade de fazer uma lista de permissões em tempo real?

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 .

Devo me preocupar com isso, já que será apenas para 'postagem privada'

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

é a melhor maneira de deixá-los armazená-lo no banco de dados de qualquer forma, mas apenas exibi-lo adequadamente codificado e sem tags ruins?

É 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.

daremon
fonte
-1

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.

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }
Jon
fonte
Se eles armazenarem texto como <script> alert ("hey") </script> e você fizer Html.Encode (<script> alert ("hey") </script>), apenas imprimirá a página para não executar o comando alerta
Jon
Não estou usando uma lista de permissões, estou apenas armazenando-a como está. A função acima poderia ajudar, mas eu não sei que batida afetará. Gostaria de saber o que você decide. Por que minha postagem está marcada como negativa?
Jon
1
Eu acho que é porque a maneira como seu software está fazendo isso é uma implementação muito ingênua; existem todos os tipos de truques que contornam sua implementação.
21139 George Stocker
4
Uma lista de permissões é uma boa ideia, mas seu método certamente não é. O Regex não é uma maneira confiável de detectar tags no texto, pois o HTML pode ficar bastante ofuscado. Muito melhor usar uma biblioteca como o HTML Agility Pack.
Noldorin
-1

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.

ChrisW
fonte
-2

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).

Mike Chaliy
fonte