ฉันบันทึก HTML ที่ปลอดภัย / ถูกสุขลักษณะในตาราง DB แล้ว
ฉันจะเขียนเนื้อหา HTML นี้ในมุมมองมีดโกนได้อย่างไร
มันก็จะหนีตัวอักษรเช่นและเครื่องหมายการ<
&
ฉันบันทึก HTML ที่ปลอดภัย / ถูกสุขลักษณะในตาราง DB แล้ว
ฉันจะเขียนเนื้อหา HTML นี้ในมุมมองมีดโกนได้อย่างไร
มันก็จะหนีตัวอักษรเช่นและเครื่องหมายการ<
&
คำตอบ:
หากว่าเนื้อหาของคุณอยู่ในสตริงชื่อmystring
...
คุณสามารถใช้ได้:
@Html.Raw(mystring)
หรือคุณสามารถแปลงสตริงของคุณเป็นHtmlString
หรือประเภทอื่น ๆ ที่ใช้IHtmlString
ในรูปแบบหรืออินไลน์โดยตรงและใช้ปกติ@
:
@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
razor
ไวยากรณ์และHtml.Raw
มีให้ฉันอย่างแน่นอน
คุณสามารถใช้ได้
@{ WriteLiteral("html string"); }
Html.Raw()
ใช้งานไม่ได้
บางครั้งมันอาจเป็นเรื่องยากที่จะใช้ raw html ส่วนใหญ่เป็นเพราะช่องโหว่ XSS หากเป็นข้อกังวล แต่คุณยังต้องการใช้ html ดิบคุณสามารถเข้ารหัสส่วนที่น่ากลัวได้
@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")
ผลลัพธ์ใน
(<b><script>console.log('insert')</script>Hello</b>)
คุณสามารถใส่สตริงของคุณใน viewdata ในตัวควบคุมดังนี้:
ViewData["string"] = DBstring;
จากนั้นเรียกดู data ในมุมมองดังนี้:
@Html.Raw(ViewData["string"].ToString())
นอกเหนือจากการใช้@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 ที่เป็นไปได้เกือบทั้งหมด
ตัวอย่างที่สมบูรณ์สำหรับการใช้ฟังก์ชันเทมเพลตใน 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>
@Html.Raw()