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

15

Como todos sabemos, os ataques XSS são perigosos e realmente fácil de realizar . Várias estruturas facilitam a codificação de HTML, como a ASP.NET MVC:

<%= Html.Encode("string"); %>

Mas o que acontece quando seu cliente exige que ele possa enviar o conteúdo diretamente de um documento do Microsoft Word?

Aqui está o cenário: as pessoas podem copiar e colar o conteúdo da palavra Microsoft em um editor WYSIWYG (neste caso, tinyMCE ) e, em seguida, essa informação é postada em uma página da web.

O site é público, mas somente 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 maneira segura? Atualmente não há verificação feita sobre o que o cliente envia (já que somente usuários 'confiáveis' podem postar), mas eu não estou particularmente feliz com isso e gostaria de bloqueá-lo ainda mais no caso de uma conta ser hackeada.

O único método conceitual que conheço que atende a esses requisitos é colocar tags HTML na lista de permissões e permitir que elas passem por . Existe outro caminho? Caso contrário, o que é uma maneira segura de permitir que o usuário armazene entradas no banco de dados de qualquer forma, mas apenas exiba-as adequadamente codificadas e despojadas de tags incorretas?

Pergunta relacionada

Preventing Cross Site Scripting (XSS)

    
por George Stocker 18.06.2009 / 21:37
fonte

5 respostas

8

A maneira mais fácil (para você como desenvolvedor) é provavelmente implementar uma das muitas variações de Markdown , por exemplo < "Markdown.NET" ou, melhor ainda, um editor de wmd. com / "> editor de wmd .

Em seguida, seus usuários poderão colar HTML simples, mas nada perigoso, e poderão visualizar os dados inseridos e corrigir todos os escrúpulos antes mesmo de postar ...

    
por 18.06.2009 / 21:52
fonte
7

A lista de permissões é, na verdade, a melhor maneira de impedir ataques XSS ao permitir que os usuários insiram HTML, diretamente ou usando um Editor Rich Text.

Sobre suas outras perguntas:

Is there a WYSIWYG editor that includes the ability to whitelist on the fly?

Eu não acho que isso funcione. Você precisa do código do lado do servidor para isso e o RTE é executado no cliente.

O TinyMCE filtra as tags, se quiser, mas como isso ocorre no navegador, você não pode confiar nele. Consulte extended_valid_elements . O TinyMCE (Moxie) também sugere a lista de permissões, consulte aqui .

Should I even worry about this since it will only be for 'private posting'

Você deve sempre filtrar o HTML, a menos que haja motivos específicos para não (muito raro). Algumas razões: a) funcionalidade que é para usuários internos hoje, talvez para o público amanhã b) acesso não autorizado terá menos impacto

is the best way to let them store it in the Database in any form, but only display it properly encoded and stripped of bad tags?

É assim que eu prefiro. Eu não gosto de alterar a entrada do usuário antes de inserir no banco de dados por vários motivos.

    
por 05.07.2009 / 03:26
fonte
-1

Eu estou fazendo a mesma coisa. Eu estou usando o TinyMCE e permitindo a colagem de documentos do Word. Somente algumas pessoas que mantêm o site podem fazer isso por meio de uma área administrativa. Isso é garantido pela associação ASP.Net. Eu sou simples fazendo o código HTML.Encode quando ele é enviado para o site público.

Você pode usar o código abaixo, se quiser, antes que ele seja colocado no banco de dados, mas não tenha certeza do impacto que ele causaria a você. 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;
    }
    
por 18.06.2009 / 21:52
fonte
-1

Uma opção pode ser o Controle de edição de HTML para .NET (que eu escrevi).

É um editor HTML WYSIWYM para .NET, que suporta apenas um subconjunto dos elementos HTML , excluindo <script> elementos: assim, ele age como uma lista de permissões.

Se for para uso interno (ou seja, um site de intranet), o controle poderá ser incorporado em uma página da Web .

Eu não tenho suporte integrado para colar a partir do Word, mas eu tenho um componente que é um passo nessa direção: um Doc para Conversor de HTML ; então eu tenho os blocos de construção que você pode usar no ASP.NET para converter um Doc para HTML, exibir o HTML no editor, etc.

    
por 09.09.2010 / 00:33
fonte
-2

Minha IMHO continua confiando em seus usuários até que você vá a público.

Bem, não há maneira confiável de alcançar suas necessidades. Por exemplo, qualquer editor WYSIWYG não consegue proteger o formulário inserindo imagens com URLs (controle de uso indireto, conteúdo ilegal) ou texto (texto ilegal, texto com erros de ortografia, texto omitido).

Meu ponto de vista é que, se você puder confiar em 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 confia, 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. Este código tem alta marca em nosso modelo de threads e a 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).

    
por 06.07.2009 / 00:11
fonte