2015-07-10 12 views
6

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> 

Trả lời

0

Razor tự động mã hóa nó, vì vậy bạn không cần phải.

Để cụ thể, nó được mã hóa bằng cách sử dụng các phương thức mã hóa/giải mã HttpUtility và điều này xảy ra với bất kỳ thứ gì không phải là IHtmlString chẳng hạn như MvcHtmlString.

Mã hóa lại lần nữa sẽ không cần thiết. Nếu bạn cần thoát khỏi hành vi này, bạn cần sử dụng trình trợ giúp Html.Raw, đây có thể là một nguy cơ bảo mật nếu người dùng nhập giá trị mô hình mà bạn đang hiển thị.

+0

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

+0

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

+0

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

8

Dao cạo thực hiện mã hóa HTML trên chuỗi theo mặc định. Tùy thuộc vào nơi chuỗi của bạn đang được tiêm vào luồng HTML, điều này có thể hoặc không phải là mã hóa chính xác để sử dụng. Nếu nó không phải là mã hóa chính xác, sau đó bạn cần phải thực hiện mã hóa chính xác cho mình và chắc chắn để trở về một MvcHtmlString (tức là một IHtmlString) để đảm bảo Razor lá mã hóa tùy chỉnh của bạn một mình.

Vì dao cạo sử dụng mã hóa HTML, khác biệt về mặt kỹ thuật với mã hóa thuộc tính HTML (đó là tập con), không sử dụng @ Html.Raw (Html.AttributeEncode (Model.Value)) cho thuộc tính HTML mã hóa giá trị. Đồng thời, cũng không cần thiết vì mã hóa HTML mặc định sử dụng cùng một định dạng cơ bản và sẽ chỉ kết thúc mã hóa một vài ký tự nếu không sẽ không cần mã hóa trong giá trị thuộc tính HTML. Mặt khác, trong trường hợp cuối cùng khi một chuỗi được đưa vào dấu ngoặc kép của một chuỗi JavaScript, mã hóa HTML sẽ hoàn toàn không chính xác, vì vậy bạn chắc chắn cần phải tự thực hiện mã hóa như tôi đã làm: @ Html.Raw (HttpUtility.JavaScriptStringEncode (Model.Value)).

Các vấn đề liên quan