2012-07-06 29 views
5

Tương tự như this question nhưng tôi không quan tâm lắm đến những ký tự sẽ không gây ra lỗi. Tôi tò mò về phương pháp mà tôi có thể gọi, để tự kiểm tra, nếu chuỗi hiện tại sẽ kích hoạt thông báo lỗi trên.Cách kiểm tra xem chuỗi có kích hoạt “Đã xảy ra lỗi giá trị Request.Form nguy hiểm không…”

Để cung cấp một chút nền, tôi đang tạo mật khẩu ngẫu nhiên khi người dùng quên họ và cần đặt lại. Thật không may, trình tạo mật khẩu ngẫu nhiên "vô tình" đã tạo một cái với &# trong đó gần đây. Điều này khiến trang bị ngắt khi người dùng cố đăng nhập bằng trang đó.

Như đã đề cập trong nhiều bài viết xung quanh chủ đề này, ValidateRequest=false (hoặc <httpRuntime requestValidationMode="2.0" /> cho .NET 4.0) có thể được sử dụng để tắt NET kiểm tra đối với những khai thác, nhưng tôi không thấy lý do nào để mất lớp phụ này bảo mật khi tôi là người tạo chuỗi đầu tiên. Và chỉ cần yêu cầu trình tạo ngẫu nhiên tái phân ngẫu nhiên trên danh sách không đầy đủ (<, &#, v.v.) dường như không phải là giải pháp sạch nhất vì vậy tôi muốn sử dụng cùng phương pháp kiểm tra .NET đang sử dụng.

Giải thích của Microsoft về những gì khai thác đang được đề cập và những gì đang được thực hiện để bảo vệ chống lại chúng here.

This guy nói về việc tìm kiếm hàm có tên IsDangerousString sau khi tìm hiểu bằng Reflector, nhưng tôi không thể tìm thấy chức năng này để sử dụng chức năng này. Ngoài ra, ông đang đề cập đến .NET 1.1 và tôi đang làm việc với .NET 3.5

+0

Thú vị câu hỏi, nhưng tôi không thấy có lý do tại sao bạn cần phải có nhân vật mơ hồ như vậy. Tôi có thể sử dụng lớp RandomNumberGenerator để điền vào một byte [] và sau đó sử dụng một bộ mã hóa z-base32 để mã hóa các byte thành một chuỗi. – Shelakel

+2

bạn biết ký tự "khai thác" bạn muốn cho phép tại sao Html không mã hóa chúng trước khi đăng và sau đó giải mã html chúng trở lại – HatSoft

+0

@Shelakel Chắc chắn, có rất nhiều cách khác để tạo mật khẩu ngẫu nhiên. Thật không may, tuy nhiên, chúng tôi đang mắc kẹt cần phải thực hiện tất cả 4 của 4 quy tắc nhân vật (chữ thường, chữ hoa, số, char đặc biệt) với mật khẩu cho dự án này. Tất nhiên, tôi chỉ có thể loại bỏ các ký tự "tối nghĩa" vi phạm, nhưng kể từ khi spec không phải là rất rõ ràng tôi muốn sử dụng cùng một chức năng hệ thống là để kiểm tra. – Mercurybullet

Trả lời

5

Lớp ASP.NET xác thực yêu cầu là System.Web.CrossSiteScriptingValidation và phương thức bạn muốn là IsDangerousString. Thật không may, cả hai được đánh dấu là internal, vì vậy bạn không thể truy cập trực tiếp chúng. Bạn có một số tùy chọn:

Tùy chọn 1: Gọi IsDangerousString qua Phản ánh. Tuy nhiên, Microsoft có thể thay đổi phương pháp bất cứ lúc nào, điều này sẽ phá vỡ ứng dụng của bạn.

Tùy chọn 2: Biên dịch IsDangerousString và sao chép nó vào ứng dụng của riêng bạn. Xem mã bên dưới.

Tùy chọn 3: Gọi Membership.GeneratePassword. Điều này trả về một mật khẩu được đảm bảo để vượt qua xác nhận yêu cầu.

Trích từ lớp ASP.NET CrossSiteScriptingValidation (thông qua NET Reflector):

private static char[] startingChars = new char[] { '<', '&' }; 

internal static bool IsDangerousString(string s, out int matchIndex) 
{ 
    matchIndex = 0; 
    int startIndex = 0; 
    while (true) 
    { 
     int num2 = s.IndexOfAny(startingChars, startIndex); 
     if (num2 < 0) 
     { 
      return false; 
     } 
     if (num2 == (s.Length - 1)) 
     { 
      return false; 
     } 
     matchIndex = num2; 
     char ch = s[num2]; 
     if (ch != '&') 
     { 
      if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?')))) 
      { 
       return true; 
      } 
     } 
     else if (s[num2 + 1] == '#') 
     { 
      return true; 
     } 
     startIndex = num2 + 1; 
    } 
} 

private static bool IsAtoZ(char c) 
{ 
    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))); 
} 
+3

Cảm ơn thông tin.Kể từ khi chức năng là nội bộ và tôi sẽ không thể truy cập trực tiếp để cập nhật, là có bất kỳ lý do không chỉ sử dụng regex sau đây (với ignoreCase)? '\ <[a-z! /?] | & #' – Mercurybullet

+0

Regex tương đương với Tùy chọn 2, chỉ ngắn gọn hơn nhiều. :-) Đây có lẽ là điều tốt nhất bạn có thể làm ngay bây giờ. Trong phiên bản tiếp theo của ASP.NET, bạn sẽ có thể bỏ qua việc xác thực cho một số trường nhất định bằng cách sử dụng [HttpRequest.Unvalidated] (http://msdn.microsoft.com/en-us/library/system.web .httprequest.unvalidated (v = VS.110) .aspx) tài sản. –

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