Usuário com melhor resposta
usuário poder codificar em HTML e segurança

Pergunta
-
Ola pessoalHá 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
Respostas
-
- Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
-
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
-
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
-
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
-
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
-
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 RegularesPaulo Morgado- Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
Todas as Respostas
-
- Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
-
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
-
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
-
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
-
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
-
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 RegularesPaulo Morgado- Marcado como Resposta Julio Costi terça-feira, 6 de setembro de 2011 12:41
-
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".... -
-
-
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.