Texto de escape para HTML

136

Como escapar de texto para uso de html em c #? eu quero fazer

sample="<span>blah<span>"

e tem

<span>blah<span>

aparecem como texto sem formatação em vez de blá somente com as tags que fazem parte do html :(. Usando c # não ASP


fonte

Respostas:

185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);
Michael S. Scherotter
fonte
3
Se você também deseja codificar caracteres unicode em não-unicode, verifique isto: stackoverflow.com/questions/82008/…
Gyuri
4
Algo que você não deseja descobrir da pior maneira: o método acima por si só não escapa aos caracteres de controle. Veja a resposta aceita aqui: stackoverflow.com/a/4501246/1543677 e use os dois.
PkExec
Não HttpUtility não existe mais (vitória loja de aplicativos)
Tertium
82

Além disso, você pode usar isso se não quiser usar o System.Webassembly:

var encoded = System.Security.SecurityElement.Escape(unencoded)

Por este artigo , a diferença entre System.Security.SecurityElement.Escape()e System.Web.HttpUtility.HtmlEncode()é que o primeiro também codifica (')caracteres de apóstrofo .

Tereza Tomcova
fonte
7
Para não dizer SecurityElement.Escape()escapes para XML, que não é exatamente HTML.
Victor Sergienko
Não System.Security.SecurityElement não existe no Windows loja de aplicativos
Tertium
47

Se você estiver usando o .NET 4 ou superior e não quiser fazer referência System.Web, poderá usar a WebUtility.HtmlEncodepartir deSystem

var encoded = WebUtility.HtmlEncode(unencoded);

Isso tem o mesmo efeito HttpUtility.HtmlEncodee deve ser preferido System.Security.SecurityElement.Escape.

Alex
fonte
Por que deveria ser preferível ao SecurityElement.Escape? Existem vulnerabilidades no último ou o primeiro é mais capaz?
Travis
7
@Travis Também não há vulnerabilidades, é apenas que SecurityElement.Escapeopera em XML e HtmlEncodeopera em HTML, e a codificação XML e HTML tem requisitos ligeiramente diferentes (consulte esta resposta para obter detalhes). Então, por exemplo, SecurityElement.Escapeé permitido usar &apos;, enquanto HtmlEncodenão é.
19413 Alex
1
@ Travis Eu acho que a "desculpa" ainda melhor é que o System.Net está disponível para as Bibliotecas de Classes Portáteis e as outras duas opções não são / não parecem estar nesta manhã. ; ^)
ruffin
6

.NET 4.0 e superior:

using System.Web.Security.AntiXss;
//...
var encoded = AntiXssEncoder.HtmlEncode("input", useNamedEntities: true);
Vencedor
fonte
5

Você pode usar tags html reais <xmp>e </xmp>gerar a string como está para mostrar todas as tags entre as tags xmp.

Ou você também pode usar no servidor Server.UrlEncodeou HttpUtility.HtmlEncode.

Andrew Siemer
fonte
Eu deixei a pergunta mais clara. Eu não quero que as tags façam parte do html como o usuário pode </pre> e quebre.
Ótimo post obrigado cara isso resolveu exatamente o que eu estava procurando!
Spets
1
<xmp>foi descontinuado há muito tempo: stackoverflow.com/questions/8307846/… use <pre>vez
mortb 11/17/17
1

Não vi isso aqui

System.Web.HttpUtility.JavaScriptStringEncode("Hello, this is Satan's Site")

foi a única coisa que funcionou (asp 4.0+) ao lidar com html como este. O &apos;é renderizado como '(usando htmldecode) no html, causando falha:

<a href="article.aspx?id=268" onclick="tabs.open('modules/xxx/id/268', 'It&apos;s Allstars'); return false;">It's Allstars</a>
Contra
fonte
1

existem alguns caracteres de aspas especiais que não são removidos pelo HtmlEncode e não serão exibidos corretamente no Edge ou no IE como "e". você pode substituir esses caracteres por algo como a função abaixo.

private string RemoveJunkChars(string input)
{
    return HttpUtility.HtmlEncode(input.Replace("”", "\"").Replace("“", "\""));
}
Iman
fonte
Você provavelmente está veiculando conteúdo usando a codificação incorreta. O IE e o Edge não têm problemas para exibir esses caracteres.
Bouke 18/02
0

Para aqueles que no futuro procuram uma maneira simples de fazer isso nas páginas do Razor, use o seguinte:

Em .cshtml:

@Html.Raw(Html.Encode("<span>blah<span>"))

Em .cshtml.cs:

string rawHtml = Html.Raw(Html.Encode("<span>blah<span>"));
fordrof
fonte