Escape teks untuk HTML

138

Bagaimana cara meloloskan teks untuk penggunaan html di C #? aku ingin melakukan

sample="<span>blah<span>"

dan memiliki

<span>blah<span>

muncul sebagai teks biasa, bukan bla hanya dengan tag bagian dari html :(. Menggunakan C # bukan ASP


sumber

Jawaban:

185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);
Michael S. Scherotter
sumber
3
Jika Anda juga ingin menyandikan karakter unicode ke non-unicode, lihat ini: stackoverflow.com/questions/82008/…
Gyuri
4
Sesuatu yang tidak ingin Anda ketahui dengan cara yang buruk: Metode di atas dengan sendirinya tidak luput dari karakter kontrol. Lihat jawaban yang diterima di sini: stackoverflow.com/a/4501246/1543677 dan gunakan keduanya.
pkExec
HttpUtility tidak ada lagi (aplikasi win store)
Tertium
84

Juga, Anda dapat menggunakan ini jika Anda tidak ingin menggunakan System.Webrakitan:

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

Berdasarkan artikel ini , perbedaan antara System.Security.SecurityElement.Escape()dan System.Web.HttpUtility.HtmlEncode()adalah bahwa yang pertama juga menyandikan (')karakter apostrof .

Tereza Tomcova
sumber
7
Bukan untuk mengatakan SecurityElement.Escape()escapes untuk XML yang tidak persis HTML.
Victor Sergienko
System.Security.SecurityElement tidak ada di aplikasi windows store
Tertium
49

Jika Anda menggunakan .NET 4 atau lebih tinggi dan Anda tidak ingin referensi System.Web, Anda dapat menggunakan WebUtility.HtmlEncodedariSystem

var encoded = WebUtility.HtmlEncode(unencoded);

Ini memiliki efek yang sama HttpUtility.HtmlEncodedan lebih disukai daripada System.Security.SecurityElement.Escape.

Alex
sumber
Mengapa ini lebih disukai daripada SecurityElement.Escape? Apakah ada kerentanan pada yang terakhir, atau apakah yang pertama lebih mampu?
Travis
7
@Travis Tidak ada kerentanan di keduanya, hanya saja SecurityElement.Escapeberoperasi pada XML dan HtmlEncodeberoperasi pada HTML, dan pengkodean XML dan HTML memiliki persyaratan yang sedikit berbeda (lihat jawaban ini untuk detailnya). Jadi, misalnya SecurityElement.Escapediperbolehkan menggunakan &apos;, sedangkan HtmlEncodetidak.
Alex
1
@Travis Saya pikir "alasan" yang lebih baik adalah bahwa System.Net tersedia untuk Perpustakaan Kelas Portabel dan dua opsi lainnya tidak / sepertinya tidak tersedia pagi ini. ; ^)
ruffin
6

.NET 4.0 dan yang lebih baru:

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

Anda dapat menggunakan tag html yang sebenarnya <xmp>dan </xmp>menampilkan string sebagaimana untuk menampilkan semua tag di antara tag xmp.

Atau bisa juga digunakan di server Server.UrlEncodeatau HttpUtility.HtmlEncode.

Andrew Siemer
sumber
Saya membuat pertanyaan itu lebih jelas. Saya tidak ingin tag menjadi bagian dari html seperti yang dapat dilakukan pengguna </pre> dan merusaknya.
Posting yang bagus, terima kasih, ini memperbaiki apa yang saya cari!
Spesialis
1
<xmp>sudah lama tidak digunakan lagi: stackoverflow.com/questions/8307846/… gunakan <pre>sebagai gantinya
mortb
1

Tidak melihat ini di sini

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

itu adalah satu-satunya hal yang berhasil (asp 4.0+) ketika berhadapan dengan html seperti ini. Itu &apos;akan dirender sebagai '(menggunakan htmldecode) di html, menyebabkannya gagal:

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

ada beberapa karakter tanda kutip khusus yang tidak dihapus oleh HtmlEncode dan tidak akan ditampilkan di Edge atau IE dengan benar seperti "dan". Anda dapat mengganti karakter ini dengan fungsi seperti di bawah ini.

private string RemoveJunkChars(string input)
{
    return HttpUtility.HtmlEncode(input.Replace("”", "\"").Replace("“", "\""));
}
Iman
sumber
Anda mungkin menyajikan konten menggunakan pengkodean yang salah. IE dan Edge tidak memiliki masalah dalam menampilkan karakter seperti itu.
Bouke
0

Bagi mereka di masa depan yang mencari cara sederhana untuk melakukan ini di halaman Razor, gunakan yang berikut ini:

Dalam .cshtml:

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

Dalam .cshtml.cs:

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