2013-08-06 69 views
9

.Net 4.0 là mã hóa dấu nháy đơn khi tôi đang sử dụng Attributes.Add để thêm các sự kiện phía máy khách vào đối tượng asp.net của tôi. Trong các phiên bản trước, điều này đã không xảy ra..Net 4.0 được mã hóa một trích dẫn khi sử dụng Attributes.Add

ví dụ:

<asp:Image runat="server" ID="imgTest" ImageUrl="~/DateControl/cal.gif" /> 

imgTest.Attributes.Add("onmouseover", "alert('Hello')"); 

Khi tôi xem đầu ra phía khách hàng, tôi nhận được

<img id="ctl00_MainContent_calFromTimeStamp1_imgTest" onmouseover="alert(&#39;Hello&#39;)" src="../DateControl/cal.gif" style="border-width:0px;" /> 

Tôi tìm thấy một workaround bằng cách tạo ra một bộ mã hóa tùy chỉnh: creating custom encoding routines nhưng tôi không muốn dừng mã hóa cho toàn bộ trang web chỉ vì vấn đề này. Bất cứ ai có một workaround hoặc một ý tưởng về cách sửa lỗi này?

Trả lời

0

Nhờ Franzo của link, nơi mà các câu trả lời sau đây được sao chép và dán:

Bạn có thể tắt mã hóa thuộc tính bằng cách tạo ra một lớp học như thế này:

public class HtmlAttributeEncodingNot : System.Web.Util.HttpEncoder 
{ 
    protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output) 
    { 
     output.Write(value); 
    } 
} 

và thêm này để web.config theo:

<httpRuntime encoderType="HtmlAttributeEncodingNot"/> 

Điều này mang lại cho tôi sự kiểm soát tôi cần.

Tuy nhiên, bây giờ chúng ta phải lo lắng rằng điều khiển mới có thể phụ thuộc vào hành vi mới chuẩn 4.0 và không mã hóa dấu nháy đơn, vì vậy nó vẫn còn không hoàn hảo, nay, tồi tệ hơn không hoàn hảo: an ninh thậm chí còn tồi tệ hơn, vì chúng tôi don' t biết những gì đang xảy ra ở đâu, vì vậy nó không phải là một workaround tuyệt vời thực sự.

Tôi nghĩ chỉ có Microsoft mới có thể sửa lỗi này đúng cách. Những người khác đã đề xuất sự cần thiết cho một lớp HtmlAttributeString ở đây: link Nếu có là một lớp và Thuộc tính như vậy.Thêm có thể mất một đối tượng như thế này cho tham số giá trị của nó sau đó chúng tôi sẽ có sự kiểm soát mà chúng ta cần một lần nữa.

0

imgTest.Attributes.Add("onmouseover", "alert(\'Hello\')");

+1

didnt này làm việc –

4

Theo Microsoft bạn không nên thêm hoạt Javascript để HTML thuộc tính sử dụng WebControl.Attributes.Add(), chính xác bởi vì nó sẽ mã hóa các giá trị thuộc tính:

Bạn không thể thêm client-side script để một trường hợp WebControl sử dụng bộ sưu tập thuộc tính . Để thêm tập lệnh phía máy khách, hãy sử dụng thuộc tính ClientScript trên điều khiển Trang.

Source

Lời khuyên là sử dụng Page.ClientScript.RegisterExpandoAttribute(string controlId, string attributeName, string attributeValue, bool encode)method. Trong trường hợp của bạn, nó sẽ trông như sau:

Page.ClientScript.RegisterExpandoAttribute(
    imgTest.ClientID, 
    "onmouseover", 
    "alert('Hello')", 
    false /* Do not encode */ 
); 

Điều này sẽ dẫn đến một đoạn mã JavaScript trong trang của bạn đặt thuộc tính phía máy khách.

+3

Kịch bản java mà bộ mặt attirbute khách hàng đã có, nhưng ngọn lửa sự kiện didnt, tôi đã cố gắng nó trên Chrome và IE –

+0

Cùng ở đây - Tôi có thể thấy kịch bản để thêm thuộc tính - nhưng nó không cháy. – Ian

0

Không nên tắt mã hóa thuộc tính. Nếu bạn cố gắng ngăn chặn mã hóa theo mặc định, có nhiều hành vi lạ xảy ra với mã của bạn trong tương lai và bạn phải trả giá cho các thực tiễn không tốt.

.NET luôn mã hóa mọi thuộc tính để ngăn chặn việc tiêm tập lệnh độc hại. Vì vậy, bạn nên đi theo thực hành mặc định này để bảo vệ chương trình của bạn.

1

Cách tốt nhất để thiết lập sự kiện thuộc tính trong .NET là để gọi một chức năng duy nhất:

imgTest.Attributes("message") = "Hello"; 
imgTest.Attributes("onmouseover") = "showMessage(this);" 

Và trên trang của bạn, hoặc kịch bản đã đăng ký:

function showMessage(ctrl) 
{ 
    alert(ctrl.getAttribute('message')); 
} 
+0

ví dụ bạn đưa ra không thực sự hiển thị giải pháp vì văn bản bạn sử dụng không chứa dấu ngoặc kép. Hãy xem xét điều này: 'link.Attributes [" my_command "] =" myfunc ('hello world') "; link.Attributes ["onclick"] = "eval (this.my_command)"; '. Thuộc tính mới 'my_command' không được mã hoá nhưng được giải mã bằng phương thức' eval() '. – paul

-2

Bạn có thể sử dụng một ký tự thoát trước bất kỳ ký tự trích dẫn nào:

Nguồn:

this.Attributes.Add("onmouseover", string.Format("$(this).attr(\'src\',\'{0}\')",this.Page.ClientScript.GetWebResourceUrl(typeof(SwapImage), urlenabledkey))); 

Render:

onmouseover="$(this).attr('src','/WebResource.axd?d=kHY3FE9nMsUOvDU-pPthg4KQvVrnXlcASyA7dFf6L