Escape text สำหรับ HTML


138

ฉันจะหลีกเลี่ยงข้อความสำหรับ html ที่ใช้ใน C # ได้อย่างไร ฉันต้องการที่จะทำ

sample="<span>blah<span>"

และมี

<span>blah<span>

แสดงเป็นข้อความธรรมดาแทนที่จะเป็น blah เฉพาะกับส่วนแท็กของ html :( การใช้ C # ไม่ใช่ ASP

c#  html  escaping 

คำตอบ:


185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);

3
หากคุณต้องการเข้ารหัสอักขระ Unicode เป็น non-unicode ให้ตรวจสอบสิ่งนี้: stackoverflow.com/questions/82008/…
Gyuri

4
สิ่งที่คุณไม่ต้องการหาวิธีที่ไม่ดี: วิธีการข้างต้นโดยตัวมันเองไม่ได้หลบหนีอักขระควบคุม ดูคำตอบที่ยอมรับได้ที่นี่: stackoverflow.com/a/4501246/1543677และใช้ทั้งสองอย่าง
pkExec

ไม่มี HttpUtility อีกต่อไป (win store apps)
Tertium

84

นอกจากนี้คุณสามารถใช้สิ่งนี้ได้หากคุณไม่ต้องการใช้System.Webชุดประกอบ:

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

ตามบทความนี้ความแตกต่างระหว่างSystem.Security.SecurityElement.Escape()และSystem.Web.HttpUtility.HtmlEncode()คืออดีตยังเข้ารหัส(')อักขระอะพอสทรอฟี


7
ไม่ต้องบอกว่าSecurityElement.Escape()Escape สำหรับXMLซึ่งไม่ใช่ HTML อย่างแน่นอน
Victor Sergienko

System.Security.SecurityElement ไม่มีในแอ
Tertium

49

หากคุณใช้. NET 4 ขึ้นไปและคุณไม่ต้องการอ้างอิงSystem.Webคุณสามารถใช้WebUtility.HtmlEncodeจากSystem

var encoded = WebUtility.HtmlEncode(unencoded);

นี้มีผลเช่นเดียวกับและควรจะต้องการมากกว่าHttpUtility.HtmlEncodeSystem.Security.SecurityElement.Escape


เหตุใดจึงควรเลือกใช้มากกว่า SecurityElement.Escape ในช่วงหลังมีช่องโหว่หรือมีความสามารถมากกว่าเดิมหรือไม่?
Travis

7
@Travis ไม่มีช่องโหว่ใด ๆ เพียงแค่SecurityElement.Escapeทำงานบน XML และHtmlEncodeทำงานบน HTML และการเข้ารหัส XML และ HTML มีข้อกำหนดที่แตกต่างกันเล็กน้อย (ดูรายละเอียดคำตอบนี้ ) ตัวอย่างเช่นSecurityElement.Escapeอนุญาตให้ใช้&apos;ในขณะที่HtmlEncodeไม่ได้
Alex

1
@Travis ฉันคิดว่า "ข้อแก้ตัว" ที่ดียิ่งขึ้นคือSystem.Net พร้อมใช้งานใน Portable Class Librariesและอีกสองตัวเลือกไม่ใช่ / ดูเหมือนจะไม่ใช่ในเช้านี้ ; ^)
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- asp-net-mvc-2.aspx


1
กรุณาให้ไวยากรณ์สำหรับ Razor? @Nacht


5

คุณสามารถใช้แท็ก html จริง<xmp>และ</xmp>เพื่อส่งออกสตริงตามที่แสดงแท็กทั้งหมดระหว่างแท็ก xmp

หรือคุณสามารถใช้บนเซิร์ฟเวอร์Server.UrlEncodeหรือHttpUtility.HtmlEncode.


ฉันทำให้คำถามชัดเจนมากขึ้น ฉันไม่ต้องการให้แท็กเป็นส่วนหนึ่งของ html เนื่องจากผู้ใช้สามารถทำ </pre> และทำลายได้

โพสต์ที่ดีขอบคุณคนนี้แก้ไขสิ่งที่ฉันกำลังมองหา!
Spets

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 ไม่มีปัญหาในการแสดงตัวอักษรดังกล่าว
Bouke

0

สำหรับผู้ที่กำลังมองหาวิธีง่ายๆในการทำเช่นนี้ในหน้า Razor ให้ใช้ดังต่อไปนี้:

ใน. cshtml:

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

ใน. cshtml.cs:

string rawHtml = Html.Raw(Html.Encode("<span>blah<span>"));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.