Escape текст для HTML

136

Как мне избежать текста для использования HTML в C #? я хочу делать

sample="<span>blah<span>"

и имеют

<span>blah<span>

отображаться как обычный текст вместо бла только с тегами часть HTML :(. Использование C # не ASP


источник

Ответы:

185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);
Майкл С. Щероттер
источник
3
Если вы также хотите закодировать символы Unicode в не-Unicode, проверьте это: stackoverflow.com/questions/82008/…
Gyuri
4
То, что вы не хотите, чтобы найти плохой способ: вышеупомянутый метод сам по себе не экранирует управляющие символы. Смотрите принятый ответ здесь: stackoverflow.com/a/4501246/1543677 и используйте оба.
pkExec
HttpUtility больше не существует (магазин приложений win)
Tertium
82

Кроме того, вы можете использовать это, если вы не хотите использовать System.Webсборку:

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

Согласно этой статье , разница между System.Security.SecurityElement.Escape()и System.Web.HttpUtility.HtmlEncode()заключается в том, что первый также кодирует (')символы апострофа .

Тереза ​​Томцова
источник
7
Не сказать, SecurityElement.Escape()ускользает от XML, который не совсем HTML.
Виктор Сергиенко
System.Security.SecurityElement не существует в приложениях магазина Windows
Tertium
47

Если вы используете .NET 4 или выше и не хотите ссылаться System.Web, вы можете использовать WebUtility.HtmlEncodeизSystem

var encoded = WebUtility.HtmlEncode(unencoded);

Это имеет тот же эффект, что HttpUtility.HtmlEncodeи должно быть предпочтительным System.Security.SecurityElement.Escape.

Alex
источник
Почему это должно быть предпочтение над SecurityElement.Escape? Есть ли уязвимости в последнем, или первый просто более способный?
Трэвис
7
@Travis В них также нет уязвимостей, просто он SecurityElement.Escapeработает на XML и HtmlEncodeработает на HTML, а XML и HTML-кодирование предъявляют немного разные требования (подробности см. В этом ответе ). Так, например, SecurityElement.Escapeразрешено использовать &apos;, пока HtmlEncodeнет.
Алекс
1
@ Travis Я думаю, что еще лучше «оправдание» в том, что System.Net доступна для переносимых библиотек классов, а два других варианта отсутствуют / не кажутся сегодня утром. ; ^)
ruffin
19

никто еще не упомянул, в ASP.NET 4.0 есть новый синтаксис для этого. вместо того

<%= HttpUtility.HtmlEncode(unencoded) %>

ты можешь просто сделать

<%: unencoded %>

читайте больше здесь: http://weblogs.asp.net/scottgu/archive/2010/04/06/new-lt-gt-syntax-for-html-encoding-output-in-asp-net-4-and- жерех-нетто-MVC-2.aspx

Nacht
источник
1
дайте пожалуйста синтаксис для бритвы? @Nacht
6

.NET 4.0 и выше:

using System.Web.Security.AntiXss;
//...
var encoded = AntiXssEncoder.HtmlEncode("input", useNamedEntities: true);
Виктор
источник
5

Вы можете использовать фактические HTML-теги <xmp>и </xmp>вывести строку как есть, чтобы показать все теги между тегами xmp.

Или вы также можете использовать на сервере Server.UrlEncodeили HttpUtility.HtmlEncode.

Эндрю Симер
источник
Я сделал вопрос более понятным. Я не хочу, чтобы теги были частью html, так как пользователь может </ pre> сделать это.
Отличный пост, спасибо человеку, это исправлено именно то, что я искал!
Спец
1
<xmp>давно устарел: stackoverflow.com/questions/8307846/… используйте <pre>вместо этого
mortb
1

Не видел это здесь

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

это было единственное, что работало (asp 4.0+) при работе с html подобным образом. &apos;Получает отображается как '( с использованием htmldecode) в HTML, вызывая его на провал:

<a href="article.aspx?id=268" onclick="tabs.open('modules/xxx/id/268', 'It&apos;s Allstars'); return false;">It's Allstars</a>
против
источник
1

есть некоторые специальные символы кавычек, которые не удаляются HtmlEncode и не будут правильно отображаться в Edge или IE, например »и«. Вы можете заменить эти символы на что-то вроде функции ниже.

private string RemoveJunkChars(string input)
{
    return HttpUtility.HtmlEncode(input.Replace("”", "\"").Replace("“", "\""));
}
Иман
источник
Вы, вероятно, обслуживаете контент, используя неправильную кодировку. IE и Edge не имеют проблем с отображением таких символов.
Бук
0

Для тех, кто в будущем ищет простой способ сделать это на страницах Razor, используйте следующее:

В .cshtml:

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

В .cshtml.cs:

string rawHtml = Html.Raw(Html.Encode("<span>blah<span>"));
fordrof
источник