2008-10-27 27 views
7

Trong ứng dụng web của tôi, thông số của tôi có thể chứa tất cả các loại ký tự điên (ký tự tiếng Nga, dấu gạch chéo, dấu cách, vv) và có thể không luôn được biểu diễn như trong URL.
Gửi chúng theo cách vui vẻ của họ sẽ làm việc trong khoảng 50% các trường hợp. Một số thứ như không gian đã được mã hóa ở đâu đó (tôi đoán trong Html.BuildUrlFromExpression có). Những thứ khác mặc dù (như "/" và "*") thì không.Double/incomplete Tham số Url Encoding

Bây giờ tôi không biết phải làm gì nữa vì nếu tôi mã hóa chúng, mã hóa của tôi sẽ được mã hóa một lần nữa và kết thúc sai. Nếu tôi không mã hóa chúng, một số nhân vật sẽ không vượt qua được.

Tôi đã làm theo cách thủ công .replace() các ký tự mà tôi gặp sự cố.
Đây là khóa học không phải là một ý tưởng hay.

Ý tưởng?

--Edit--
Tôi biết có vô số các thư viện mã hóa/giải mã sắp xếp của tôi. Dường như khung mvc đã cố gắng làm điều đó cho tôi, nhưng không hoàn toàn.

<a href="<%=Html.BuildUrlFromExpression<SearchController>(c=>c.Search("", 1, "a \v/&irdStr*ng"))%>" title="my hat's awesome!"> 

sẽ làm cho tôi

<a href="/Search.mvc/en/Search/1/a%20%5Cv/&irdStr*ng" title="my hat's awesome!"> 

Chú ý cách dấu gạch chéo, dấu hoa thị và dấu và không trốn thoát. Tại sao một số người trốn thoát và những người khác thì không? Làm thế nào tôi có thể thoát khỏi điều này đúng cách?

Tôi có làm điều gì đó sai hay là khung làm việc?

Trả lời

0

Bạn đã thử sử dụng phương pháp Server.UrlEncode() để thực hiện mã hóa và phương pháp Server.UrlDecode() để giải mã?

Tôi chưa gặp bất kỳ sự cố nào khi sử dụng nó để chuyển các mục.

+0

Cảm ơn phản hồi của bạn. Vui lòng xem bài đăng gốc của tôi cho bản chỉnh sửa tôi đã thực hiện. Tôi nghĩ câu hỏi của tôi không đủ rõ ràng. –

0

Server.URLEncode hoặc HttpServerUtility.UrlEncode

tôi thấy những gì bạn đang nói bây giờ - Tôi đã không nhận ra câu hỏi là cụ thể để MVC. Có vẻ như một hạn chế của phần đó trong khuôn khổ MVC - đặc biệt là BuildUrlFromExpression đang thực hiện một số mã hóa URL, nhưng nó biết rằng cũng cần một số dấu chấm câu như một phần của URL khung.

Và cũng may, URLEncoding không tạo ra một bất biến, ví dụ:

URLEncode(x) != URLEncode(URLEncode(x)) 

Sẽ không có được tốt đẹp. Sau đó, bạn có thể mã hóa trước các biến của bạn và chúng sẽ không được mã hóa kép.

Có lẽ một khung thực hành ASP.NET MVC tốt nhất cho việc này. Tôi đoán một điều bạn có thể làm là mã hóa thành base64 hoặc cái gì đó là URLEncode-bất biến.

+0

UrlEncode lạ đủ không sử dụng http://www.w3schools.com/TAGS/ref_urlencode.asp này. Không gian ví dụ được mã hóa thành% 25. –

+0

HttpUtility.UrlPathEncode mặc dù –

+0

Thực ra đó là vấn đề của tôi. Cảm ơn bạn đã đi qua một lần nữa. –

2

Các thông số cần được thoát bằng Uri.EscapeDataString:

  string url = string.Format("http://www.foo.bar/page?name={0}&address={1}", 
       Uri.EscapeDataString("adlknad /?? lkm#"), 
       Uri.EscapeDataString(" qeio103 8182")); 

      Console.WriteLine(url); 
      Uri uri = new Uri(url); 
      string[] options = uri.Query.Split('?','&'); 
      foreach (string option in options) 
      { 
       string[] parts = option.Split('='); 
       if (parts.Length == 2) 
       { 
        Console.WriteLine("{0} = {1}",parts[0], 
         Uri.UnescapeDataString(parts[1])); 
       } 
      } 
+0

Cảm ơn phản hồi, nhưng xin lưu ý thẻ asp.net-mvc. Tôi đã chỉnh sửa câu hỏi của mình để xóa mọi thứ. –

+0

Thẻ thay đổi nhanh chóng; Tôi đã đi chỉ bởi câu hỏi ban đầu ;-p Nhưng công bằng đủ ... –

0

Hãy thử sử dụng Microsoft Anti-Cross Site Scripting library. Nó chứa một số phương thức mã hóa, mã hóa tất cả các ký tự (bao gồm #, và ký tự bằng các ngôn ngữ khác).Đối với giải mã, trình duyệt sẽ xử lý Url được mã hóa tốt, tuy nhiên nếu bạn cần giải mã Url theo cách thủ công, hãy sử dụng Uri.UnescapeDataString

Hy vọng điều đó sẽ hữu ích.

+0

Đó là một liên kết hữu ích alright, nhưng tôi nghĩ rằng nó sẽ không giải quyết vấn đề của tôi. Tôi đã cố gắng giải quyết vấn đề của mình rõ ràng hơn trong bản chỉnh sửa của tôi. Xin hãy xem. –

0

Việc thoát khỏi các dấu ngã và dấu chấm về phía trước trong phần đường dẫn của url bị cấm bởi lý do bảo mật (trong đó, nó hoạt động đơn).

+0

tại sao vậy? những gì có thông số yêu cầu những thứ này ... Tôi biết tôi nên cố gắng không có những thứ này, nhưng đó là một nguồn dữ liệu bên ngoài. Mọi người sử dụng nó để tìm kiếm mọi thứ. Không có cách nào tôi có thể thay đổi dữ liệu ... –

0

Html.BuildUrlFromExpression cần phải được sửa sau đó, sẽ gửi luồng này lên dự án MVC ... cách khác là mã hóa chuỗi trước khi chuyển đến BuildUrlFromExpression và giải mã nó khi quay lại ở phía bên kia.

Có thể không dễ dàng khắc phục được, vì IIS có thể xử lý giải mã chuỗi url trước ... có thể cần phải mã hóa/giải mã nâng cao hơn cho các ký tự thay thế trong phương thức tiện ích và giải mã thay cho bạn sắp ra.

1

Như những người khác đã đề cập, nếu bạn mã hóa chuỗi của mình trước tiên, bạn sẽ giải quyết vấn đề.

Khung MVC mã hóa các ký tự mà nó biết cần mã hóa, nhưng để lại những ký tự là các ký tự URL hợp lệ (ví dụ: &%? * /). Điều này là do đây là các ký tự URL hợp lệ, mặc dù chúng là các trình chracters đặc biệt trong một URL có thể không đạt được kết quả mà bạn đang theo dõi.

+1

Các nhân vật không sử dụng hệ thống sẽ tạo ra nhiều lý do hơn để mã hóa chúng? Tôi không thấy bất kỳ lý do tại sao tôi nên vượt qua trong một tham số mà đã làm (một phần của) công việc phương pháp thực tế là nghĩa vụ phải làm. –

+0

Nó không phải vì chúng là hệ thống được sử dụng, nhưng vì chúng không phải là ký tự hợp lệ theo đặc tả URL mà chúng được mã hóa. Tuy nhiên, các ký tự khác định nghĩa ý nghĩa trong một URL không được mã hóa vì chúng hoàn toàn hợp lệ. – Ady

0

Tôi đã xem các bài đăng tương tự về vấn đề này. Quá tôi, nó trông giống như một lỗ hổng trong MVC. Hàm này sẽ được đặt tên phù hợp hơn là "BuildUrlFromEncodedExpression". Whats tồi tệ hơn, đó là chức năng được gọi là cần giải mã các thông số đầu vào của nó. Yuk.

Nếu có bất kỳ sự chồng chéo nào giữa các ký tự được mã hóa BuildUrlFromExpression() và các ký tự được mã hóa bởi người gọi (người, tôi nghĩ có thể mã hóa bất kỳ phần mềm không phải chữ và số nào).