2013-09-25 35 views
5

Tôi có trang web kiểm tra cookie được mã hóa khi tải trang để xác định danh tính người dùng. Tuy nhiên, khi tôi kiểm tra trang cục bộ trên hộp phát triển của mình, tôi không có quyền truy cập vào cookie đó.Có an toàn cho Request.IsLocal hoặc nó có thể bị giả mạo không?

Trước đây tôi đã sử dụng một ứng dụng để cho biết trang đó có ở chế độ phát triển hay không và khi ở chế độ dev, nó sẽ tải danh tính người dùng cố định. Sau đó, tôi phát hiện ra Request.IsLocal

Tôi chỉ đơn giản là có thể kiểm tra như thế này:

if(Request.IsLocal){ 
    FormsAuthentication.SetAuthCookie("testUser", false); 
}else{ 
    FormsAuthentication.SetAuthCookie(/*EncryptedCookieValue*/, false); 
} 

Đây có phải là an toàn? Có cách nào một người dùng độc hại có thể giả mạo IsLocal không?

+0

'Request.IsLocal' trả về' true' khi _ "địa chỉ IP của trình khởi tạo yêu cầu là 127.0.0.1 hoặc [...] giống với IP của máy chủ" _. Vì vậy, nó có thể được giả mạo như địa chỉ IP có thể được giả mạo, và nó sẽ hoàn toàn nằm khi có một số loại máy chủ proxy hoặc cân bằng tải làm việc trên cùng một máy chủ. – CodeCaster

+2

có thể trùng lặp: http://stackoverflow.com/questions/7148821/request-islocal – k3davis

Trả lời

6

Tôi nghĩ câu hỏi thực tế của bạn là, bạn có chức năng phát triển như thế nào?

Bạn bạn có thể sử dụng: Environment.UserInteractive
http://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx

Nó trả sai khi chạy trong IIS hoặc một dịch vụ Windows, đúng khi họ là một giao diện người dùng ví dụ: Visual Studio khi phát triển của bạn.

Tôi nghĩ rằng điều này tốt hơn biến DEBUG pre processor vì hành vi nhất quán hơn, bạn có thể vô tình tải lên phiên bản DEBUG của dll lên môi trường sống trừ khi bạn có quá trình xây dựng/phát hành rất chặt chẽ.

Theo quy tắc chung, không nên tin tưởng bất cứ điều gì từ khách hàng.
Tôi cũng sẽ thực dụng, bạn đang bảo vệ cái gì và sẽ có bao nhiêu nỗ lực để tấn công?

dưới đây bài SO đi vào một số trong những lý do tại sao bạn không nên tin tưởng nó:
Can I fool HttpRequest.Current.Request.IsLocal?

Reference
Bạn có thể xem mã nguồn tại http://referencesource.microsoft.com

public bool IsLocal { 
    get { 
     String remoteAddress = UserHostAddress; 

     // if unknown, assume not local 
     if (String.IsNullOrEmpty(remoteAddress)) 
     return false; 

     // check if localhost 
     if (remoteAddress == "127.0.0.1" || remoteAddress == "::1") 
     return true; 

     // compare with local address 
     if (remoteAddress == LocalAddress) 
     return true; 

     return false; 
    } 
+0

Không hoạt động với CDN như cloudflare – jjxtra

2

Mã cho IsLocal có vẻ mạnh mẽ - Tôi không thể thấy bất kỳ sai sót nào trong logic của nó vì vậy cho mục đích của bạn, nó là nên là tốt. Tuy nhiên, bạn nên lưu ý rằng nếu ứng dụng của bạn (hoặc bất kỳ ứng dụng nào khác chạy trên cùng một máy chủ) thực hiện bất kỳ yêu cầu HTTP nào mà đích đến của bạn có thể bị ảnh hưởng bởi người dùng cuối thì bạn nên thêm một lớp bảo mật bổ sung chẳng hạn như khóa bí mật/hết hạn hoặc mã thông báo cho yêu cầu của bạn hoặc bạn có thể bảo mật yêu cầu HTTP khi được thực hiện để không thể yêu cầu tài nguyên cục bộ.

ví dụ: Giả sử trang web của bạn có điểm kết thúc như http://www.example.com/DeleteAllUsers và trong mã xử lý yêu cầu này, bạn đang kiểm tra IsLocal để đảm bảo rằng người dùng chỉ có thể bị xóa nếu đó là yêu cầu địa phương, đáng tin cậy.

Bây giờ giả sử bạn có một chức năng trên trang web của bạn Nhập địa chỉ web để xem tiêu đề: và người dùng nhập vào http://www.example.com/DeleteAllUsers trong hộp văn bản này, gây ra ứng dụng của bạn để yêu cầu DeleteAllUsers và đáp ứng việc kiểm tra IsLocal an ninh do yêu cầu HTTP được tạo từ ứng dụng của bạn. Đây là cách IsLocal có thể được khai thác, và tôi nhận ra đó là một ví dụ giả mạo để chứng minh quan điểm, nhưng rất nhiều trang web làm những việc tương tự như lấy một hình ảnh xem trước của một URL để hiển thị. Nếu không có gì trên máy chủ của bạn có thể được thực hiện để thực hiện một yêu cầu HTTP cục bộ, bạn nên thực hiện tốt.

1

Xác định IP từ xa rất phức tạp và phụ thuộc vào cấu hình máy chủ chính xác.

Ví dụ: máy chủ định cấu hình sai có thể sử dụng X-Forwarded-For để xác định IP nhưng có thể được khách hàng chọn. Nhưng khi sử dụng một proxy ngược lại đặt nó vào IP của chính nó, đây là cách chính xác để xác định IP.

Sử dụng IP từ ổ cắm cũng có thể bị sai, xem xét proxy ngược chạy trên máy như máy chủ web.

=> Nếu có thể sử dụng cơ chế xác thực khác

1

Bạn không nên đặt mã này trên máy chủ sản xuất vì những lý do được đề cập trong các câu trả lời khác.

Tuy nhiên, bạn có thể làm

#if DEBUG 
    if (Request.IsLocal) 
    { 
     FormsAuthentication.SetAuthCookie("testUser", false); 
    } 
    else 
    { 
#endif 
     FormsAuthentication.SetAuthCookie(/*EncryptedCookieValue*/, false); 
#if DEBUG 
    } 
#endif 

Mở hộp phát triển của bạn, chạy một Debug xây dựng. Trong sản xuất, triển khai bản phát hành Bản phát hành.

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