2010-05-11 17 views
8

Hii,Làm thế nào để bảo vệ khỏi giả mạo chuỗi truy vấn?

Tôi có chuỗi truy vấn như "http://project/page1.aspx?userID=5". Thao tác sẽ không được thực hiện, nếu tham số 'userID' thay đổi theo cách thủ công. Làm thế nào nó có thể?

+1

Chỉ cần loại làm rõ - Tôi đoán trong tình huống của bạn, bạn đã phục vụ trang ra; ai đó đã nhấp vào nút ở một nơi khác và truy cập trang "http: //project/page1.aspx? userID = 5". Và bây giờ trên trang này, họ sẽ nhập một số giá trị và bạn không muốn họ trao đổi 5 trong thanh địa chỉ cho 7, nhấn "lưu" và để trang web của bạn truy cập và cập nhật thông tin của người dùng 7, chính xác? – Tom

Trả lời

3

Hii tất cả, cảm ơn bạn đã hỗ trợ của bạn ... và tôi đã nhận được một số giải pháp khác biệt từ một số trang web khác. tôi không biết rằng giải pháp tốt nhất. đó là mã hóa giá trị bằng thuật toán mã hóa và giải mã ... Mã mẫu đã được viết như thế này ...

<a href='Page1.aspx?UserID=<%= HttpUtility.UrlEncode(TamperProofStringEncode("5","F44fggjj")) %>'> 
     Click Here</a> <!--Created one anchor tag and call the function for TamperProofStringEncode--> 


    
private string TamperProofStringEncode(string value, string key) 
{ 
      System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES(); 
      System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
      mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)); 
      return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(value)) + "-" + Convert.ToBase64String(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(value))); 
     } 
 

Trong tải trang của 'Trang1' gọi thuật toán giải mã để giải mã các chuỗi truy vấn

try 
     { 
      string DataString = TamperProofStringDecode(Request.QueryString["UserID"], "F44fggjj"); 
      Response.Write(DataString); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.Message); 
     } 

private string TamperProofStringDecode(string value, string key) 
    { 
     string dataValue = ""; 
     string calcHash = ""; 
     string storedHash = ""; 

     System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES(); 
     System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
     mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)); 

     try 
     { 
      dataValue = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[0])); 
      storedHash = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[1])); 
      calcHash = System.Text.Encoding.UTF8.GetString(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(dataValue))); 

      if (storedHash != calcHash) 
      { 
       //'Data was corrupted 
       throw new ArgumentException("Hash value does not match"); 
       // 'This error is immediately caught below 

      } 
     } 
     catch (Exception ex) 
     { 
      throw new ArgumentException("Invalid TamperProofString"); 
     } 

     return dataValue; 

    } 
+0

Tôi vẫn nghĩ bạn có thể thoát khỏi bằng cách sử dụng phiên. Nhưng nếu bạn vì lý do nào đó tập hợp hoàn toàn ** cần ** để làm điều này thông qua chuỗi truy vấn và sẵn sàng đi theo con đường đó thì có lẽ nó sẽ hoạt động theo cách đó. Dù vậy tôi vẫn có mùi hôi trong miệng. Nó vẫn còn phụ thuộc ... ** Tại sao ** bạn muốn điều này hay ** chính xác bạn muốn đạt được điều gì? Bạn có thể đang theo dõi sai ... – scherand

+0

Việc sử dụng của tôi là, tôi đã gửi một thư có nội dung liên kết cùng với id người dùng. Khi tôi nhấp vào liên kết trong thư sẽ điều hướng đến trang thì trang sẽ hiển thị chi tiết của người dùng cụ thể –

1

Bạn không thể biết liệu nó đã được thay đổi theo cách thủ công hay chưa. Nếu bạn sử dụng chuỗi truy vấn thì bạn hy vọng để đảm bảo rằng nó không quan trọng nếu nó được thay đổi. ví dụ. nếu bạn đang sử dụng nó để hiển thị cho người dùng chi tiết tài khoản của họ, bạn cần kiểm tra người dùng đã chọn, là người dùng hiện tại và hiển thị thông báo lỗi thay vì dữ liệu người dùng nếu không.

+1

Tôi chỉ muốn thêm: ASP.NET có phiên, lưu trữ thông tin về người đăng nhập ở đó và kiểm tra mã của bạn nếu người dùng đã đăng nhập được phép xem dữ liệu – Felix

+0

Chắc chắn bạn có thể. Băm hoặc mã hóa chuỗi truy vấn bằng khóa bí mật được chia sẻ, bao gồm giá trị được băm hoặc mã hóa đó trong chuỗi truy vấn và sau đó tính lại nó và xác minh nó phù hợp trước khi bạn sử dụng chuỗi truy vấn. – xr280xr

3

Nghe có vẻ như là một yêu cầu lạ. Bạn đang cố gắng thực hiện một số loại bảo mật phát triển tại nhà? Nếu vậy, bạn thực sự không nên.

Dù sao đi nữa, một cách bạn có thể làm là lấy toàn bộ url http://project/page1.aspx?userID=5 và tính số md5 sum. Sau đó, bạn thêm tổng md5 vào url cuối cùng, chẳng hạn như http://project/page1.aspx?userID=5&checksum=YOURCALCULATEDMD5SUM. Sau đó, trong page1.aspx bạn sẽ phải xác nhận rằng tham số checksum là chính xác.

Tuy nhiên, cách tiếp cận này khá ngây thơ và sẽ không mất nhiều thời gian để mọi người tìm ra thuật toán bạn đã sử dụng. Nếu họ đã làm họ có thể "dễ dàng" thay đổi userid và tính toán một md5 sum mình. Một cách tiếp cận mạnh mẽ hơn sẽ là một nơi mà tổng kiểm tra được mã hóa bằng một khóa mà chỉ bạn mới có quyền truy cập. Nhưng một lần nữa tôi phải đặt câu hỏi về động cơ của bạn vì muốn làm điều này, bởi vì các giải pháp bảo mật khác tồn tại tốt hơn nhiều.

+0

Điều này sẽ không quá gần với những gì một phiên làm việc (token) không "miễn phí" trong ASP.NET? Nó cung cấp cho người dùng một Id nhiều hơn hoặc ít ngẫu nhiên/vô nghĩa hơn (id phiên/mã thông báo) mà sau đó được sử dụng để xác định dữ liệu (phiên) tương ứng. Liệu tôi có sai? – scherand

+1

@scherand: Sắp xếp ... Trong trường hợp của bạn, dữ liệu thực tế sẽ được lưu trữ phía máy chủ, trong khi trong trường hợp này dữ liệu (userID = 5) được lưu trữ trong URL. Nó có thể được đánh dấu, sẽ không gây ra vấn đề nếu bạn có nhiều trang mở cùng một lúc, vv –

+0

... mà sẽ trả về một điểm tốt. Nếu người dùng có quyền truy cập vào URL đó, thì không có cách nào để xóa quyền truy cập đó sau đó mà không cần triển khai cơ chế đăng nhập/quyền hoặc thay đổi thuật toán kiểm tra. –

0

Vâng - nó phụ thuộc :)

Một khả năng là để đưa userID vào một biến phiên. Vì vậy, người dùng không thể xem hoặc chỉnh sửa giá trị.

Nếu bạn có phương tiện khác để phát hiện nếu giá trị là không hợp lệ (nghĩa là không tồn tại hoặc không thể cho người dùng đó (người bạn có thể xác định theo cách khác) hoặc tương tự), bạn có thể lấy đi bằng cách xác thực đầu vào chính mình trong mã phía sau.

Nhưng như bạn có thể biết bạn không thể ngăn người dùng thay đổi chuỗi truy vấn.

3

Bạn không thể.

Mọi thứ trong yêu cầu HTTP (bao gồm URL, chuỗi truy vấn, cookie, ...) đều nằm dưới sự kiểm soát của khách hàng và rất dễ giả mạo.

Đây là lý do tại sao điều quan trọng là phải đưa vào danh sách trắng nội dung hợp lệ, vì khách hàng có thể tùy ý thêm bất kỳ thứ gì mình thích ngoài những gì bạn nhắc nhận.

+5

Tôi nghĩ rằng OP nhận thức được rằng (s) anh ta không thể ** ngăn chặn ** người dùng thay đổi chuỗi truy vấn. Nhưng - ở một mức độ nào đó - (s) anh ta có thể ** bảo vệ ** ứng dụng từ một chuỗi truy vấn bị thay đổi như vậy. Và đó là những gì tôi nghĩ câu hỏi là về. Chỉ cần hai xu của tôi. – scherand

1

Nếu người dùng được phép thay đổi bản ghi 5, nhưng không được ghi 7 ví dụ, điều này phải được thực thi phía máy chủ. Để thực hiện điều này, bạn cần có khả năng xác định người dùng, bằng cách yêu cầu đăng nhập và cung cấp cho họ khóa phiên duy nhất được lưu trữ trong cookie trình duyệt của họ hoặc tham số khác trong chuỗi truy vấn url.

Có gói dồi dào/modules/thư viện bằng ngôn ngữ con người để đối phó với chứng thực và các phiên trong một cách hợp lý - cuộn bạn sở hữu lúc nguy hiểm của riêng bạn :)

2

ưa thích của tôi là t anh ta theo sau. Nó sử dụng một HTTPmodule để mã hóa một cách minh bạch và giải mã chuỗi truy vấn với mục đích rõ ràng ngăn chặn giả mạo chuỗi truy vấn.

http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml

Hoàn hảo khi phiên không phải là một lựa chọn!

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