2012-01-18 30 views
20

Tôi biết rằng có nhiều câu hỏi tương tự được đăng, nhưng không có câu hỏi nào trong số đó đề cập đến ứng dụng HTML/javascript nơi người dùng có thể truy cập mã.Cách bảo vệ API REST riêng tư trong ứng dụng AJAX

Tôi có API REST riêng được viết bằng nút jj. Nó là riêng tư vì mục đích duy nhất của nó là để quản lý các ứng dụng khách hàng HTML5 của tôi (ứng dụng Chrome và ứng dụng Adobe Air). Vì vậy, một khóa API không phải là một giải pháp tốt vì bất kỳ người dùng nào cũng có thể thấy mã javascript.

Tôi muốn tránh các bot tạo tài khoản trên máy chủ và tiêu thụ tài nguyên của mình.

Có cách nào để hoàn thành việc này không?

+2

Tôi không chắc chắn nếu bất kỳ câu trả lời nào thỏa mãn câu hỏi của bạn. Vui lòng chia sẻ cách bạn tiếp cận vấn đề mà bạn đã mô tả. Tôi đang xây dựng ứng dụng web dựa trên REST + AJAX có thể được sử dụng cho những người dùng chưa đăng ký. Giống như chính mình, tôi muốn bảo vệ tài nguyên từ các chương trình. –

+0

Về mặt logic, thực sự không có cách nào để làm cho một API thực sự riêng tư nếu nó được gọi từ một trang web mà bất cứ ai cũng có thể xem nguồn và/hoặc theo dõi dữ liệu đang được gửi tới máy chủ. Để bắt chương trình bạn có các thủ thuật thông thường như Captcha nhưng cuối cùng bạn cần hỗ trợ back-end (WAFs, tự động mở rộng quy mô nhanh, vv) để đối phó với khả năng tấn công kiểu DDOS tự động. Miễn là bạn phát hiện khả năng các cuộc tấn công DDOS càng sớm càng tốt (trước khi thực hiện kết nối DB, vv), nó không khác gì để xử lý các bot cố tải xuống trang này ngay từ đầu. –

Trả lời

15

Khóa API là một giải pháp tốt, đặc biệt nếu bạn yêu cầu những ràng buộc về nguồn gốc yêu cầu của khóa API; hãy xem xét rằng bạn chỉ nên chấp nhận khóa API nếu yêu cầu web gốc có nguồn gốc từ một nguồn được ủy quyền, chẳng hạn như miền riêng của bạn. Nếu yêu cầu web đến từ một miền trái phép, bạn có thể từ chối xử lý yêu cầu.

Bạn có thể cải thiện tính bảo mật của cơ chế này bằng cách sử dụng lược đồ mã hóa chuyên biệt, chẳng hạn như mã xác thực thông điệp dựa trên băm (HMAC). Các tài nguyên sau đây giải thích cơ chế này rõ ràng:

http://cloud.dzone.com/news/using-api-keys-effectively

+2

Điều quan trọng là phải quan sát rằng giải pháp khóa API hoạt động đối với hàng tá API khác bao gồm Google Maps, Flickr, Facebook, v.v. Bí quyết là trong quá trình triển khai. –

+0

Tôi không thể kiểm soát người dùng của mình đến từ đâu, đó là ứng dụng công khai. Google maps, Flickr, vv sử dụng các khóa API nhưng tôi không chắc chắn nếu họ lo lắng về việc ai sử dụng các phím. Tôi nghĩ rằng tôi có thể sao chép và sử dụng bất kỳ khóa bản đồ Google nào (chưa thử). – aartiles

+0

Bạn không thể chỉ cần sao chép khóa API Google Maps và sử dụng nó trong một tên miền khác, vì API Google Maps liên kết mọi khóa API được tạo cho một lớp miền cụ thể (ví dụ: mydomain.com) và mọi yêu cầu đi kèm đều được kiểm tra URL giới thiệu và thông tin khác được mã hóa trong khóa API. Một lần nữa, một cơ chế mã hóa điển hình là HMAC. Các khóa API sẽ là vô ích nếu không. –

1

Những gì bạn muốn làm là sử dụng SSL lẫn nhau xác thực, do đó máy chủ của bạn sẽ chỉ chấp nhận kết nối từ ứng dụng của bạn và ứng dụng của bạn sẽ chỉ liên lạc với máy chủ của bạn .

Đây là cách tiếp cận cấp cao. Tạo chứng chỉ SSL máy chủ tự ký và triển khai trên máy chủ web của bạn. Nếu bạn đang sử dụng Android, bạn có thể sử dụng công cụ khóa được bao gồm trong SDK Android cho mục đích này; nếu bạn đang sử dụng nền tảng ứng dụng khác, các công cụ tương tự tồn tại cho chúng. Sau đó, tạo một máy khách tự ký và triển khai trong ứng dụng của bạn trong một kho khóa tùy chỉnh được bao gồm trong ứng dụng của bạn như một tài nguyên (keytool cũng sẽ tạo ra điều này). Cấu hình máy chủ để yêu cầu xác thực SSL phía máy khách và chỉ chấp nhận chứng chỉ ứng dụng khách mà bạn đã tạo. Định cấu hình ứng dụng khách để sử dụng chứng chỉ phía máy khách đó để xác định chính nó và chỉ chấp nhận chứng chỉ phía máy chủ mà bạn đã cài đặt trên máy chủ của mình cho phần đó.

Nếu ai đó/ứng dụng khác cố gắng kết nối với máy chủ của bạn, kết nối SSL sẽ không được tạo vì máy chủ sẽ từ chối kết nối SSL đến không xuất trình chứng chỉ ứng dụng khách mà bạn đã đưa vào ứng dụng của mình.

Từng bước cho câu hỏi này là câu trả lời dài hơn nhiều so với bảo hành ở đây. Tôi khuyên bạn nên thực hiện điều này theo các giai đoạn vì có các tài nguyên trên web về cách xử lý chứng chỉ SSL tự ký trong Android (tôi không quen với cách thực hiện điều này trên các nền tảng di động khác), cả máy chủ và phía máy khách. Ngoài ra còn có một bước đi hoàn chỉnh trong cuốn sách của tôi, Bảo mật ứng dụng cho nền tảng Android, được xuất bản bởi O'Reilly.

+0

Ứng dụng web của tôi là javascript và HTML thuần túy, không phải là android – aartiles

+0

Và cách tiếp cận này vẫn hoạt động. Thực thi SSL lẫn nhau giữa máy chủ web của ứng dụng và bất kỳ ứng dụng khách nào bạn muốn liên lạc. – jeffsix

+0

Tôi có thể làm điều đó cho trình duyệt web chuẩn như thế nào? Cho phép nói Google Chrome. – aartiles

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