2009-03-07 61 views
6

Tôi đã xây dựng một ứng dụng sử dụng jQuery và JSON để tiêu thụ dịch vụ web ASP.NET .asmx để thực hiện các thao tác crud. Ứng dụng và .asmx nằm trên cùng một miền. Tôi không nhớ người tiêu thụ các hoạt động đọc của .asmx từ xa nhưng không muốn mọi người xóa công cụ một cách ngẫu nhiên !!!Chặn các cuộc gọi tên miền chéo tới dịch vụ web asp.net .asmx

Tôi có thể chia các phương thức mà tôi muốn truy cập công khai và các phương thức 'ẩn' thành 2 dịch vụ web. Làm thế nào tôi có thể khóa các cuộc gọi đến dịch vụ web 'hidden'.asmx đến cùng một tên miền được lưu trữ trong đó?

Xin cảm ơn trước.

Edit: Có thể ai đó bình luận về vấn đề này, có vẻ chính đáng (nguồn: http://www.slideshare.net/simon/web-security-horror-stories-presentation): Ajax có thể thiết lập HTTP Headers, hình thức bình thường không thể. Yêu cầu Ajax phải từ cùng một miền.

Vì vậy, yêu cầu "x-request-with" "XMLHttpRequest" phải từ cùng một tên miền.

+0

Bạn có câu hỏi cụ thể về bản trình bày đó không? Tất cả mọi thứ chắc chắn được sử dụng để thỏa hiệp các trang web, nhưng với sự bảo vệ cơ bản bạn được an toàn. –

+0

có phần của nó, nơi nó nói bạn có thể dựa vào x-yêu cầu-với để cho bạn biết nó từ cùng một tên miền và do đó an toàn. ive hỏi cùng một câu hỏi ở nơi khác ngày hôm nay và mọi người đều tin rằng bất kỳ tiêu đề http nào cũng có thể bị giả mạo. Tôi không chắc lắm. anyway, ive giải quyết điều này theo cách khác (refactor lớn) – jdee

+0

nhưng cảm ơn rất nhiều vì đã giúp đỡ của bạn. nó chắc chắn đưa tôi đi đúng hướng để giải quyết vấn đề thế giới thực của tôi. – jdee

Trả lời

8

Có hai kịch bản bạn cần phải đảm bảo với các dịch vụ web:

  1. Sản phẩm dùng xác thực?
  2. Hành động có đến từ trang của tôi không?

Phần xác thực đã được xử lý nếu bạn đang sử dụng Xác thực biểu mẫu. Nếu dịch vụ web của bạn nằm trong khu vực được bảo vệ bằng Biểu mẫu xác thực của trang web, không ai có thể truy cập dịch vụ web của bạn trừ khi họ đăng nhập.

Kịch bản thứ hai là một câu chuyện hơi phức tạp hơn. Cuộc tấn công được gọi là CSRF hoặc XSRF (Cross Site Request Forgery). Điều này có nghĩa là trang web độc hại thực hiện các tác vụ thay mặt cho người dùng của bạn trong khi họ vẫn đăng nhập vào trang web của bạn. Here's a great writeup on XSRF.

Jeff Atwood loại tóm tắt tất cả lên trong liên kết trên, nhưng ở đây là bảo vệ XSRF trong bốn bước:

  1. Viết một GUID với cookie của người dùng của bạn.
  2. Trước cuộc gọi AJAX, hãy đọc giá trị này ra khỏi cookie và thêm nó vào POST dịch vụ web.
  3. Ở phía máy chủ, so sánh giá trị MẪU với giá trị cookie.
  4. Do các trang web không thể đọc cookie từ một miền khác, bạn an toàn.
-1

Trong AJAX trình duyệt thực hiện cuộc gọi, vì vậy ngay cả khi bạn kiểm tra xem tên miền có giống nhau hay không, nó sẽ không đủ an toàn vì nó có thể dễ dàng bị giả mạo.

Bạn cần sử dụng một số loại mã xác thực/tự động hóa (tốt nhất là hết thời gian chờ) để giữ mọi thứ an toàn.

+0

bạn có thể xây dựng? làm thế nào tôi có thể hệ thống token bạn đề cập đến? – jdee

+0

> đó phải là 'làm cách nào tôi có thể tạo hệ thống mã thông báo mà bạn đề cập?' thanks – jdee

+0

Bạn phải phát hành một khóa mà ajax phải gửi lại khi người dùng yêu cầu một hoạt động crud. Phím này sẽ hết hạn sau một khoảng thời gian ngắn, cách này chỉ các trang được tạo từ máy chủ của bạn có khóa và có thể thực hiện các thao tác – Sruly

-1

Giải pháp nhanh chóng và bẩn sẽ là sử dụng các hạn chế địa chỉ IP để chỉ cho phép truy cập địa chỉ IP của tên miền của bạn thông qua IIS.

Có thể tốt hơn là sử dụng xác thực HTTP. Có nhiều cách để thực hiện việc này, tôi đã tìm thấy Authentication in ASP.NET Web Services một tổng quan hữu ích.

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