การเขียน / ส่งออกสตริง HTML ที่ไม่ใช้ค่า Escape


436

ฉันบันทึก HTML ที่ปลอดภัย / ถูกสุขลักษณะในตาราง DB แล้ว

ฉันจะเขียนเนื้อหา HTML นี้ในมุมมองมีดโกนได้อย่างไร

มันก็จะหนีตัวอักษรเช่นและเครื่องหมายการ<&amp;


76
เพื่อช่วยให้ผู้คนมีประวัติยาวนานของการสนทนาด้านล่าง -@Html.Raw()
Chris S

เมื่อต้องการบันทึกคนอย่างฉันที่พยายามทำสิ่งนี้ด้วยประเภทนิรนามในมุมมองที่พิมพ์แบบไดนามิกซึ่งไม่สามารถใช้งานได้ - ดูคำตอบนี้สำหรับคำถามเฉพาะของฉัน แม้ว่าการใช้วิธีการนี้ด้วยมุมมองที่พิมพ์อย่างรุนแรงยังคงดีกว่าหากสถานการณ์ของคุณอนุญาต
brichins

คำตอบ:


653

หากว่าเนื้อหาของคุณอยู่ในสตริงชื่อmystring...

คุณสามารถใช้ได้:

@Html.Raw(mystring)

หรือคุณสามารถแปลงสตริงของคุณเป็นHtmlStringหรือประเภทอื่น ๆ ที่ใช้IHtmlStringในรูปแบบหรืออินไลน์โดยตรงและใช้ปกติ@:

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString

ขอบคุณสำหรับคำตอบนี้ ช่วยฉันทำภารกิจเล็กน้อยให้สำเร็จ :) อย่างไรก็ตามฉันใช้ MVC3 เวอร์ชันล่าสุดและตอนนี้ไม่มี Html.Raw :(

1
สวัสดีเซร์คิโอ ฉันใช้ MVC 3 และฉันใช้วิธี Raw อย่างถูกต้อง
Gui

1
ขอบคุณสำหรับคำตอบ! ฉันยังคงเรียนรู้ MVC 3 อยู่และนี่ก็เป็นการหลบหลีกฉัน
Todd Richardson

3
@ Lorenzo, +1 ฉันใช้ MVC 3 ล่าสุดกับrazorไวยากรณ์และHtml.Rawมีให้ฉันอย่างแน่นอน
Chris Snowden

1
Lorenzo ฉันได้อัพเดทคำตอบเพื่อลบการกล่าวถึง MVC Beta เหมือนเมื่อหลายปีก่อน รู้สึกฟรีเพื่อย้อนกลับ / เปลี่ยนแปลง
Alexei Levenkov

75

ใน ASP.NET MVC 3 คุณควรทำสิ่งนี้:

// Say you have a bit of HTML like this in your controller:
ViewBag.Stuff = "<li>Menu</li>"
//  Then you can do this in your view:
@MvcHtmlString.Create(ViewBag.Stuff)

13
ฉันชอบวิธีนี้เพราะ HTML.Raw จะระเบิดถ้าสตริงที่ส่งเป็นโมฆะ
37Stars

1
ขอบคุณนี่สะอาดมาก!
ฮัจจั

64

คุณสามารถใช้ได้

@{ WriteLiteral("html string"); }

5
นี่ยอดเยี่ยมมากสำหรับฉันใช้มีดโกนในแอพ Hangfire เพื่อส่งอีเมล ... Html.Raw()ใช้งานไม่ได้
shanabus

1 สำหรับ WriteLiteral
muhammed basil

11

บางครั้งมันอาจเป็นเรื่องยากที่จะใช้ raw html ส่วนใหญ่เป็นเพราะช่องโหว่ XSS หากเป็นข้อกังวล แต่คุณยังต้องการใช้ html ดิบคุณสามารถเข้ารหัสส่วนที่น่ากลัวได้

@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")

ผลลัพธ์ใน

(<b>&lt;script&gt;console.log('insert')&lt;/script&gt;Hello</b>)

4

คุณสามารถใส่สตริงของคุณใน viewdata ในตัวควบคุมดังนี้:

 ViewData["string"] = DBstring;

จากนั้นเรียกดู data ในมุมมองดังนี้:

@Html.Raw(ViewData["string"].ToString())

2

นอกเหนือจากการใช้@MvcHtmlString.Create(ViewBag.Stuff) ที่แนะนำโดย Dommer ผมขอแนะนำให้คุณใช้AntiXSSห้องสมุดตามที่แนะนำ Phill http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp -net.aspx

มันเข้ารหัสสตริงการโจมตี XSS ที่เป็นไปได้เกือบทั้งหมด


0

ตัวอย่างที่สมบูรณ์สำหรับการใช้ฟังก์ชันเทมเพลตใน RazorEngine (สำหรับการสร้างอีเมลเป็นต้น):

@model SomeModel
@{
    Func<PropertyChangeInfo, object> PropInfo =
        @<tr class="property">
            <td>
                @item.PropertyName                
            </td>
            <td class="value">
                <small class="old">@item.OldValue</small>
                <small class="new">@item.CurrentValue</small>                
            </td>
        </tr>;
}

<body>

@{ WriteLiteral(PropInfo(new PropertyChangeInfo("p1", @Model.Id, 2)).ToString()); }

</body>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.