2010-11-10 42 views

Trả lời

18

Vấn đề là khi điều này được đăng lên máy chủ, nó sẽ không hoạt động, không quan trọng những gì bạn thử. Đây là bảo vệ ASP.NET XSS, có thể bị vô hiệu hóa như vậy:

<%@ Page ... ValidateRequest="false" %> 

Rắc rối là, bạn sẽ phải rất cẩn thận xác nhận tất cả các postback mình. Cách dễ dàng hơn là thoát tất cả nội dung của hộp văn bản bằng cách sử dụng javascript ngay trước khi đăng. Bạn có thể thoát khỏi nó bằng cách sử dụng cùng một HTML thoát, sau đó unescape trong mã phía máy chủ.

Cập nhật: Ví dụ về thoát. Điều này sẽ làm thay đổi văn bản đã thay đổi trên màn hình trước khi đăng lại - giải pháp lý tưởng là sử dụng trường ẩn cho điều này, tức là gán giá trị cho trường ẩn, thay vì trường đó.Đây là phiên bản đơn giản nhất:

<script> 
    function EscapeField(){ 
    document.getElementById("your client control ID").value = 
     escape(document.getElementById("your client control ID").value); 
    } 
</script> 

Và trong code-behind:

this.ClientScript.RegisterOnSubmitStatement(this.GetType(), 
    "EscapeField", "EscapeField();") 

Cập nhật: Một lần nữa, cảnh báo - nếu bạn lưu HTML trong cơ sở dữ liệu của bạn như thế này, và sau đó chỉ cần hiển thị nó cho khách hàng, bạn đang trực tiếp dễ bị tấn công XSS. Có những con giun ở đó sẽ tìm và khai thác trang web của bạn. Hãy chắc chắn rằng bạn làm sạch HTML bạn đang nhận được.

+0

thoát? Ý anh là gì? Thí dụ? – Brettski

+1

Tôi không thấy bất kỳ lợi thế nào để thoát, sau đó không tự sửa lỗi khi chỉ tắt xác thực. Dù bằng cách nào bạn vẫn phải đảm bảo bạn mã hóa các giá trị để hiển thị lại. –

+5

@TimAbell - Lợi thế là cách này bạn có thể tắt xác thực cho một điều khiển duy nhất và không cho toàn bộ trang. –

4

Chuyển đổi họ &lt;&gt;. Trong Html, &lt; được chuyển đổi thành <&gt; được chuyển đổi thành > mà không nghĩ rằng đó là một phần của đánh dấu. Vì vậy, chuỗi <Blah> sẽ là &lt;Blah&gt;.

Sửa: Tôi quên, để tự động chuyển đổi chúng và thoát khỏi tất cả các ký tự HTML (vì vậy đây không phải là một vấn đề đối với những thứ khác), trong Asp.net bạn có thể sử dụng Server.HtmlEncode(string) để tự động chuyển đổi tất cả các nhân vật có thể gây ra các vấn đề tương đương với HTML của họ.

+0

Có, nhưng tôi cần hiển thị nó dưới dạng> và <, không phải phiên bản html – grady

+0

Khi nó hiển thị trên trang web, nó sẽ hiển thị là < >. Mã ký tự HTML được sử dụng để hiển thị các ký tự đó tại thời gian hiển thị, không có chúng được đọc không chính xác tại thời gian hiển thị/biên dịch. – KallDrexx

+1

Tôi đã thử hiển thị là < trong trường văn bản ... – grady

0
<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox> 

Tôi không biết nếu câu hỏi của bạn có liên quan đến này hoặc nếu bạn đang nhận được một vấn đề ValidateRequest

8

Nếu bạn đang ở một trang asp.net, bạn có thể bọc toàn bộ sản lượng văn bản trong một số điện thoại Server.HtmlEncode("YourTextWith<and>Characters")

và nó sẽ mã hóa mọi ký tự tinh tế cho bạn.

Nếu vì một lý do nào, bạn đang làm điều này trong một file .cs, bạn có thể sử dụng System.Web.HttpUtility.HtmlEncode("YourTextWith<and>Characters")

trước khi đi qua nó để các lớp trình bày.

+0

có, nó sẽ chuyển đổi thành < ví dụ, nhưng tôi muốn xem grady

+0

Nó chỉ nên làm điều đó nếu nó đã làm mã hóa - nhưng sau đó nó không nên lỗi ở nơi đầu tiên. Bạn có mẫu mã hoặc URL bạn có thể thêm vào câu hỏi của mình không? Và lỗi bạn nhận được, nếu có thể. –

0

Bạn có thể sử dụng TextBox.Text tài sản đó sẽ HTML mã hóa bất cứ điều gì bạn nhập

<asp:TextBox ID="TextBox1" runat="server" Text="<>"></asp:TextBox> 

hoặc bạn có thể nhập tên html cho <>.

<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox> 

hoặc bạn có thể nhập mã html

<asp:TextBox ID="TextBox1" runat="server">&#60;</asp:TextBox> 

cho tên và mã số chuyển đổi, hãy kiểm tra this biểu đồ.

2

Giải pháp đơn giản nhất là để vô hiệu hóa xác nhận yêu cầu trong các trang đơn

<%@ Page ... ValidateRequest="false" %> 

nhưng đừng quên để cho phép requestValidationMode = "2.0"

<system.web> 
    ... 
    <httpRuntime requestValidationMode="2.0" /> 
</system.web> 

Giải pháp này có thể espose một số mối đe dọa.


Một giải pháp thông minh là để thay thế thông qua javascript văn bản được viết bởi người dùng để làm cho nó an toàn để xác thực: < tag> là considere nguy hiểm, nhưng <tag> được coi là an toàn!

Thay thế javascript có thể giải quyết được sự cố.

function validateTxt() { 
    $("textarea, input[type='text']").change(function() { 
     html = $(this).val(); //get the value 
     //.replace("a" , "b") works only on first occurrence of "a" 
     html = html.replace(/< /g, "<"); //before: if there's space after < remove 
     html = html.replace(/</g, "< "); // add space after < 
     $(this).val(html); //set new value 
    }); 
} 

$(document).ready(function() { 
     validateTxt(); 
}); 
+0

chức năng 'validateTxt' hoạt động hoàn hảo cho tôi. Cảm ơn câu trả lời của bạn –

0

vấn đề của bạn là, bạn không thể sử dụng thẻ html trong điều khiển .net. vì vậy hãy đặt ValidateRequest = "false" trong trang aspx của bạn và mã hóa văn bản trước khi bạn lưu văn bản.

//encode 
    private string Encode(string text) 
    { 
     byte[] encodedText = System.Text.Encoding.UTF8.GetBytes(text); 
     return System.Convert.ToBase64String(encodedText); 
    } 

khi bạn truy xuất văn bản, hãy đảm bảo giải mã văn bản được mã hóa.

// Decode: 
    private string Decode(string encodedText) 
    { 
     byte[] decodedText = System.Convert.FromBase64String(encodedText); 
     return System.Text.Encoding.UTF8.GetString(decodedText); 
    } 
Các vấn đề liên quan