Trong tệp cshtml, tôi chỉ định chuỗi cho thuộc tính. Ví dụ:Tôi có cần mã hóa các giá trị thuộc tính trong MVC Razor không?
<input name="somename" value="@Model.Value">
Vì chuỗi Model.Value có thể chứa bất kỳ ký tự Unicode nào, rõ ràng chuỗi phải được mã hóa. Liệu Razor có tự động mã hóa giá trị này không? Tôi đoán nó sẽ không hoặc không thể vì tôi có thể dễ dàng đặt một @ Html.Raw ngay lập tức sau khi nó chia nhỏ toàn bộ điều thành hai thẻ.
Tôi nghĩ rằng những gì tôi cần phải làm điều này là:
<input name="somename" value="@Html.Raw(Html.AttributeEncode(Model.Value))">
Là đúng?
Tương tự như vậy, nếu tôi nhúng một giá trị chuỗi trong một chuỗi JavaScript trong một kịch bản, nên tôi sử dụng:
//I could use Ajax instead of HttpUtility here, but Ajax just wraps the same call.
<script>$('id').data('key','@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))');</script>
Gọi @ Html.Raw (Html.AttributeEncode (Model.Value)) không phải là dư thừa, vì Razor mã hóa giá trị cuối cùng chỉ khi nó thuộc loại chuỗi. Kể từ khi tôi mã hóa nó và trả về một MvcHtmlString, Razor sẽ không cố gắng mã hóa nó một lần nữa. * Mã hóa thuộc tính HTML * chỉ mã hóa một tập con của các ký tự * Mã hóa HTML *, nhưng do mã hóa sử dụng cùng định dạng (ví dụ: "&name;", "nnnn;") và bạn có thể mã hóa các ký tự không cần mã hóa , mã hóa HTML Razor là đủ cho cả giá trị thuộc tính HTML và HTML. Vì vậy, nó an toàn để chỉ sử dụng @ Model.Value trong trường hợp này. – Triynko
Tôi cũng nhận thức được nhu cầu mã hóa để tránh các rủi ro bảo mật như HTML-injection. Tôi đã chỉ ra rằng trừ khi Razor đủ thông minh để biết ngữ cảnh của chuỗi đang được nhúng, nó không thể chọn mã hóa khác cho các giá trị thuộc tính HTML so với nội dung HTML. Nó không, và bởi vì mã hóa thuộc tính là một tập hợp con của mã hóa HTML, nó là tốt để chỉ mã hóa HTML tất cả mọi thứ bất kể nơi chuỗi Razor kết thúc. Xem: http://stackoverflow.com/a/13246856/88409 – Triynko
Tôi cũng nên đề cập đến trong trường hợp của @Html.Nguyên (HttpUtility.JavaScriptStringEncode (Model.Value)), điều đó là hoàn toàn cần thiết, bởi vì mã hóa HTML sẽ sai và thực sự có thể dẫn đến một nguy cơ bảo mật. Trong trường hợp đó, bạn hoàn toàn phải kiểm soát mã hóa và đảm bảo rằng những gì bạn đang tiêm vào luồng HTML ở vị trí chính xác mà bạn đang tiêm nó được định dạng chính xác. – Triynko