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

c#  html  escaping 

Jawaban:


185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);

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 .


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.


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);

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.


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>

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("“", "\""));
}

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>"));
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.