none
usuário poder codificar em HTML e segurança RRS feed

  • Pergunta

  • Ola pessoal
    Há um formulário que eu tenho que deixar o usuario digitar um texto em HTML.
    (algo parecido com este forum)


    A um tempão atras eu usava um componente, que dava para colocar em negrito, italico, alterar fonte, etc.


    é basicamente isso que precisa, não necessariamente deixar informar HTML (embora seja interessante, já que o cliente pode receber um template pronto).


    Só que... isso de deixar o usuário livre para digitar HTML e tal... scripts... fazer vinculo com qualquer script, pensei na bagunça que o cara mal intencionado pode fazer


    Tem alguma forma de bloquear codigos maliciosos?
    mas tem que pensar tambem q ele pode fazer um "script src" de outro site e tal,

    Acho que vai ter que ser um componente q o cara SÓ formate, q não tenha acesso a codigo html.


    Ou teria alguma outra opção, para manter a segurança e deixar o usuario livre codificar em html?



    Julio C.

    • Editado Julio Costi quinta-feira, 1 de setembro de 2011 20:04 corrigir formatação
    quinta-feira, 1 de setembro de 2011 20:03

Respostas

  • Isto serve? FreeTextBox - ASP.NET Rich HTML editor


    Paulo Morgado
    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sexta-feira, 2 de setembro de 2011 15:44
  • Boa tarde Julio, ja viu a novo componente do ajaxtoolkit chamado HtmlEditorExtender:

    http://ajaxcontroltoolkit.codeplex.com/ 
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sexta-feira, 2 de setembro de 2011 17:09
  • Opa, 

     

    blz, pessoal.. vou ver esses componentes!

     

    pelo que vi , são editores html em modo de texto, tipo Word, que dá para formatar e tal.. exatamente oq eu preciso..

    mas oq mais me preocupa é a questão da segurança... afinal, em determinado momento, esse codigo html será mostrado em uma pagina, para  impressão... então se houver codigo malicioso ou algo assim, pode comprometer a segurança... 

    teria alguma forma de se proteger disso, ou sera que os componentes já previnem isso?


    Julio C.
    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sexta-feira, 2 de setembro de 2011 21:15
  • Julio,

    Na verdade voce vai ter que implementar um filtro na hora de gravar as informações... mas não acredito que seja algo muito complexo... pq existem poucos elementos que pode ser prejudiciais num codigo html...

    Basicamente os codigos maliciosos ou estão dentro de uma tag "<script>", "<object>", "<applet>", "<embed>" ou nos atributos "OnClick", OnLoad, etc...

    Aqui tem um exemplo de como remover tags usando regular expressions       http://www.dotnetperls.com/remove-html-tags

    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sábado, 3 de setembro de 2011 00:43
    Moderador
  • um exemplo pra servir de base... pode ser q eu tenha esquecido algo...

    static Regex scriptTags = new Regex("(<script.+?>(.*?)./script>)|(<script.+?/>)", RegexOptions.Compiled);
    static Regex objectTags = new Regex("(<object.+?>(.*?)./object>)|(<object.+?/>)", RegexOptions.Compiled);
    static Regex appletTags = new Regex("(<applet.+?>(.*?)./applet>)|(<applet.+?/>)", RegexOptions.Compiled);
    static Regex embbedTags = new Regex("(<embbed.+?>(.*?)./embbed>)|(<embbed.+?/>)", RegexOptions.Compiled);
    static Regex scriptAttributes = new Regex("(On(.*?)=(\"|')(.*?)(\"|'))|(On(.*?)=(.*?)\\s)", RegexOptions.Compiled);        
    
    static string CleanUpHtml(string html) {
        html = scriptTags.Replace(html, String.Empty);
        html = objectTags.Replace(html, String.Empty);
        html = appletTags.Replace(html, String.Empty);
        html = embbedTags.Replace(html, String.Empty);
        return scriptAttributes.Replace(html, String.Empty);
    }
    


    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sábado, 3 de setembro de 2011 01:07
    Moderador
  • Cuidado com essas expressões regulares porque podem não apanhar tudo. Não apanham, por exemplo isto:
    <script>alert("test")</script>
    
    Já para não falar da caixa.
    Também estão a ser criadas demasiadas strings sem necessidade.
    Depois de pensar um pouco no assunto, cheguei a esta conclusão:
    Regex.Replace(
        sourceHtml,
        "(<(?<t>script|object|applet|embbed|frameset|iframe|form|textarea)(\\s+.*?)?>.*?</\\k<t>>)"
            + "|(<(script|object|applet|embbed|frameset|iframe|form|input|button|textarea)(\\s+.*?)?/?>)"
            + "|((?<=<\\w+)((?:\\s+)((?:on\\w+=((\"[^\"]*\")|('[^']*')|(.*?)))|(?<a>(?!on)\\w+=((\"[^\"]*\")|('[^']*')|(.*?)))))*(?=/?>))",
        match =>
        {
            if (!match.Groups["a"].Success)
            {
                return string.Empty;
            }
            
            var attributesBuilder = new StringBuilder();
            
            foreach(Capture capture in match.Groups["a"].Captures)
            {
                attributesBuilder.Append(' ');
                attributesBuilder.Append(capture.Value);
            }
            
            return attributesBuilder.ToString();
        },
        RegexOptions.IgnoreCase
            | RegexOptions.CultureInvariant
            | RegexOptions.Multiline
            | RegexOptions.ExplicitCapture
            | RegexOptions.Compiled
    );
    
    

    Podem encontrar a explicação aqui: Limpado HTML Com Expressões Regulares

    Paulo Morgado
    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    segunda-feira, 5 de setembro de 2011 04:46

Todas as Respostas

  • Isto serve? FreeTextBox - ASP.NET Rich HTML editor


    Paulo Morgado
    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sexta-feira, 2 de setembro de 2011 15:44
  • Boa tarde Julio, ja viu a novo componente do ajaxtoolkit chamado HtmlEditorExtender:

    http://ajaxcontroltoolkit.codeplex.com/ 
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sexta-feira, 2 de setembro de 2011 17:09
  • Opa, 

     

    blz, pessoal.. vou ver esses componentes!

     

    pelo que vi , são editores html em modo de texto, tipo Word, que dá para formatar e tal.. exatamente oq eu preciso..

    mas oq mais me preocupa é a questão da segurança... afinal, em determinado momento, esse codigo html será mostrado em uma pagina, para  impressão... então se houver codigo malicioso ou algo assim, pode comprometer a segurança... 

    teria alguma forma de se proteger disso, ou sera que os componentes já previnem isso?


    Julio C.
    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sexta-feira, 2 de setembro de 2011 21:15
  • Julio,

    Na verdade voce vai ter que implementar um filtro na hora de gravar as informações... mas não acredito que seja algo muito complexo... pq existem poucos elementos que pode ser prejudiciais num codigo html...

    Basicamente os codigos maliciosos ou estão dentro de uma tag "<script>", "<object>", "<applet>", "<embed>" ou nos atributos "OnClick", OnLoad, etc...

    Aqui tem um exemplo de como remover tags usando regular expressions       http://www.dotnetperls.com/remove-html-tags

    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sábado, 3 de setembro de 2011 00:43
    Moderador
  • um exemplo pra servir de base... pode ser q eu tenha esquecido algo...

    static Regex scriptTags = new Regex("(<script.+?>(.*?)./script>)|(<script.+?/>)", RegexOptions.Compiled);
    static Regex objectTags = new Regex("(<object.+?>(.*?)./object>)|(<object.+?/>)", RegexOptions.Compiled);
    static Regex appletTags = new Regex("(<applet.+?>(.*?)./applet>)|(<applet.+?/>)", RegexOptions.Compiled);
    static Regex embbedTags = new Regex("(<embbed.+?>(.*?)./embbed>)|(<embbed.+?/>)", RegexOptions.Compiled);
    static Regex scriptAttributes = new Regex("(On(.*?)=(\"|')(.*?)(\"|'))|(On(.*?)=(.*?)\\s)", RegexOptions.Compiled);        
    
    static string CleanUpHtml(string html) {
        html = scriptTags.Replace(html, String.Empty);
        html = objectTags.Replace(html, String.Empty);
        html = appletTags.Replace(html, String.Empty);
        html = embbedTags.Replace(html, String.Empty);
        return scriptAttributes.Replace(html, String.Empty);
    }
    


    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    sábado, 3 de setembro de 2011 01:07
    Moderador
  • Cuidado com essas expressões regulares porque podem não apanhar tudo. Não apanham, por exemplo isto:
    <script>alert("test")</script>
    
    Já para não falar da caixa.
    Também estão a ser criadas demasiadas strings sem necessidade.
    Depois de pensar um pouco no assunto, cheguei a esta conclusão:
    Regex.Replace(
        sourceHtml,
        "(<(?<t>script|object|applet|embbed|frameset|iframe|form|textarea)(\\s+.*?)?>.*?</\\k<t>>)"
            + "|(<(script|object|applet|embbed|frameset|iframe|form|input|button|textarea)(\\s+.*?)?/?>)"
            + "|((?<=<\\w+)((?:\\s+)((?:on\\w+=((\"[^\"]*\")|('[^']*')|(.*?)))|(?<a>(?!on)\\w+=((\"[^\"]*\")|('[^']*')|(.*?)))))*(?=/?>))",
        match =>
        {
            if (!match.Groups["a"].Success)
            {
                return string.Empty;
            }
            
            var attributesBuilder = new StringBuilder();
            
            foreach(Capture capture in match.Groups["a"].Captures)
            {
                attributesBuilder.Append(' ');
                attributesBuilder.Append(capture.Value);
            }
            
            return attributesBuilder.ToString();
        },
        RegexOptions.IgnoreCase
            | RegexOptions.CultureInvariant
            | RegexOptions.Multiline
            | RegexOptions.ExplicitCapture
            | RegexOptions.Compiled
    );
    
    

    Podem encontrar a explicação aqui: Limpado HTML Com Expressões Regulares

    Paulo Morgado
    • Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
    segunda-feira, 5 de setembro de 2011 04:46
  • Cuidado com essas expressões regulares porque podem não apanhar tudo. Não apanham, por exemplo isto:
    <script>alert("test")</script>
    
    Já para não falar da caixa.
    Também estão a ser criadas demasiadas strings sem necessidade.
    Depois de pensar um pouco no assunto, cheguei a esta conclusão:
    Regex.Replace(
        sourceHtml,
        "(<(?<t>script|object|applet|embbed|frameset|iframe|form|textarea)(\\s+.*?)?>.*?</\\k<t>>)"
            + "|(<(script|object|applet|embbed|frameset|iframe|form|input|button|textarea)(\\s+.*?)?/?>)"
            + "|((?<=<\\w+)((?:\\s+)((?:on\\w+=((\"[^\"]*\")|('[^']*')|(.*?)))|(?<a>(?!on)\\w+=((\"[^\"]*\")|('[^']*')|(.*?)))))*(?=/?>))",
        match =>
        {
            if (!match.Groups["a"].Success)
            {
                return string.Empty;
            }
            
            var attributesBuilder = new StringBuilder();
            
            foreach(Capture capture in match.Groups["a"].Captures)
            {
                attributesBuilder.Append(' ');
                attributesBuilder.Append(capture.Value);
            }
            
            return attributesBuilder.ToString();
        },
        RegexOptions.IgnoreCase
            | RegexOptions.CultureInvariant
            | RegexOptions.Multiline
            | RegexOptions.ExplicitCapture
            | RegexOptions.Compiled
    );
    
    

    Podem encontrar a explicação aqui: Limpado HTML Com Expressões Regulares

    Paulo Morgado

    Pois é... como eu disse "um exemplo pra servir de base... pode ser q eu tenha esquecido algo...", apenas gosto de deixar alguma coisa para o cara fazer assim ele tem a chance de aprender ao inves de programar na base do "copia e cola"....
    segunda-feira, 5 de setembro de 2011 14:31
    Moderador
  • Pois! Ensinar a pescar em vez de dar peixe. :)

    Eu também sou assim. Mas até foi divertido brincar com expressões regulares. Havia tempo que não o fazia.


    Paulo Morgado
    segunda-feira, 5 de setembro de 2011 17:02
  • Pois! Ensinar a pescar em vez de dar peixe. :)

    Eu também sou assim. Mas até foi divertido brincar com expressões regulares. Havia tempo que não o fazia.


    Paulo Morgado
    É eu sei, tambem ia só diser... "Use expressoes regulres"... mas me empolguei tambem um pouco... -_-'
    segunda-feira, 5 de setembro de 2011 22:53
    Moderador
  • Opa, Obrigado, Rui e Paulo...

     

    Eu tinha noção de que tinha que "bloquear" algumas expressões.. mas nem fazia ideia de quais, em um contexto geral, e até mesmo se havia como mensurar (por exemplo, se não correria risco de ficar muita coisa de fora)

    Mas então, tem como, é por aí mesmo... era isso que eu queria ter mais noção, claro as expressões eu vou atras mais um pouco

    ;)

     

    Juntando esses codigos com as sugestões dos componentes, ficou show

     

    Valeu!


    Julio C.
    terça-feira, 6 de setembro de 2011 12:41