Tôi đã lưu HTML an toàn / vệ sinh trong bảng DB.
Làm cách nào tôi có thể viết nội dung HTML này trong chế độ xem Dao cạo?
Nó luôn thoát khỏi các ký tự như <
và ký hiệu &
.
Tôi đã lưu HTML an toàn / vệ sinh trong bảng DB.
Làm cách nào tôi có thể viết nội dung HTML này trong chế độ xem Dao cạo?
Nó luôn thoát khỏi các ký tự như <
và ký hiệu &
.
Câu trả lời:
Giả sử nội dung của bạn nằm trong một chuỗi có tên mystring
...
Bạn có thể dùng:
@Html.Raw(mystring)
Ngoài ra, bạn có thể chuyển đổi chuỗi của mình thành HtmlString
hoặc bất kỳ loại nào khác thực hiện IHtmlString
trong mô hình hoặc trực tiếp nội tuyến và sử dụng thường xuyên @
:
@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
razor
cú pháp và Html.Raw
chắc chắn có sẵn cho tôi.
Trong ASP.NET MVC 3 Bạn nên làm một cái gì đó như thế này:
// 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)
Bạn có thể dùng
@{ WriteLiteral("html string"); }
Html.Raw()
không hoạt động ở đó
Đôi khi nó có thể khó sử dụng html thô. Chủ yếu là do lỗ hổng XSS. Nếu đó là một mối quan tâm, nhưng bạn vẫn muốn sử dụng html thô, bạn có thể mã hóa các phần đáng sợ.
@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")
Kết quả trong
(<b><script>console.log('insert')</script>Hello</b>)
Ngoài việc sử dụng @MvcHtmlString.Create(ViewBag.Stuff)
theo đề xuất của Dommer, tôi khuyên bạn cũng nên sử dụng thư viện AntiXSS như phill được đề xuất http://haacked.com/archive/2010/04/06/USE-antixss-as-the-default-encoder-for-asp -net.aspx
Nó mã hóa gần như tất cả các chuỗi tấn công XSS có thể.
Ví dụ hoàn chỉnh để sử dụng các hàm mẫu trong RazorEngine (ví dụ để tạo email):
@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()