2012-01-05 38 views
5

Điều gì là regular expression của Microsoft Khuôn khổ .NET sử dụng để thực hiện xác nhận tiêu chuẩn kết quả trong HttpRequestValidationException "Một giá trị Request.Form nguy hiểm tiềm tàng đã được phát hiện từ khách hàng" khi HTML hoặc khác có khả năng không an toàn nội dung được đăng.ASP.NET có khả năng nguy hiểm Yêu cầu Javascript Regex

Tôi muốn có bản sao chính xác của nó được chuyển đổi thành JavaScript để người dùng có thể được thông báo sớm.

Cụm từ thông dụng hiện tại của tôi (/ (& #) | < [^ <>] +> /) gần nhưng không giống với .NET.

Tôi biết điều này có thể khác nhau cho các phiên bản khác nhau NET rất đặc biệt tôi muốn biết:

  • Một biểu thức chính quy cho NET 2
  • Một biểu thức chính quy cho .NET 4
+1

Tôi rất nghi ngờ rằng regexes là thành phần duy nhất được ngụ ý - nếu có - để phát hiện ra ... – fge

Trả lời

4

Bạn có thể sử dụng một số công cụ giải mã và tự mình thấy rằng không có biểu thức chính quy nào cả. Nó gọi phương thức tĩnh CrossSiteScriptingValidation.IsDangerousString.

Nhưng có thể bạn có thể sử dụng thư viện Microsoft AntiXSS để đạt được điều tương tự. Dù sao ở đây là phương pháp:

internal static bool IsDangerousString(string s, out int matchIndex) 
{ 
    matchIndex = 0; 
    int num1 = 0; 
    int num2 = s.IndexOfAny(CrossSiteScriptingValidation.startingChars, num1); 
    if (num2 < 0) 
    { 
     return false; 
    } 
    if (num2 == s.Length - 1) 
    { 
     return false; 
    } 
    matchIndex = num2; 
    char chars = s.get_Chars(num2); 
    if ((chars == 38 || chars == 60) && (CrossSiteScriptingValidation.IsAtoZ(s.get_Chars(num2 + 1)) || s.get_Chars(num2 + 1) == 33 || s.get_Chars(num2 + 1) == 47 || s.get_Chars(num2 + 1) == 63)) 
    { 
     return true; 
    } 
    else 
    { 
     if (s.get_Chars(num2 + 1) == 35) 
     { 
      return true; 
     } 
    } 
    num1 = num2 + 1; 
} 
3

tôi có thể trả lời này trong một câu hỏi ở đây: https://stackoverflow.com/a/4949339/62054

regex này theo logic trong .NE T 4.

/^(?!(.|\n)*<[a-z!\/?])(?!(.|\n)*&#)(.|\n)*$/i 

Tìm nguồn .NET for CrossSiteScriptingValidation để tìm logic mà Microsoft theo dõi. fge là đúng, nó không sử dụng một regex, thay vào đó nó sử dụng một số vòng lặp và so sánh chuỗi. Tôi nghi ngờ đó là để thực hiện.

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