Dogfooding API giới hạn tỷ lệ của riêng chúng tôi


117

Tổng quat:

Công ty của tôi đã phát triển một API giới hạn tỷ lệ. Mục tiêu của chúng tôi là gấp đôi:

  • A: Tạo một hệ sinh thái nhà phát triển mạnh mẽ xung quanh sản phẩm của chúng tôi.
  • B: Thể hiện sức mạnh của API của chúng tôi bằng cách sử dụng nó để thúc đẩy ứng dụng của riêng chúng tôi.

Làm rõ: Tại sao lại giới hạn tỷ lệ?

Chúng tôi đánh giá giới hạn API của mình, bởi vì chúng tôi bán nó như một phần bổ sung cho sản phẩm của mình. Quyền truy cập ẩn danh vào API của chúng tôi có ngưỡng rất thấp cho các cuộc gọi API mỗi giờ, trong khi khách hàng trả phí của chúng tôi được phép lên tới 1000 cuộc gọi mỗi giờ hoặc hơn.

Vấn đề:

API giới hạn tỷ lệ của chúng tôi là tuyệt vời cho hệ sinh thái của nhà phát triển, nhưng để chúng tôi thực hiện dogfood nó, chúng tôi không thể cho phép nó bị hạn chế trong cùng một giới hạn tỷ lệ. Giao diện người dùng của API của chúng tôi là tất cả JavaScript, thực hiện các lệnh gọi Ajax trực tiếp đến API.

Vì vậy, câu hỏi là:

Làm thế nào để bạn bảo mật một api để có thể xóa giới hạn tỷ lệ mà trong quá trình xóa giới hạn tỷ lệ đó không thể dễ dàng bị giả mạo?

Giải pháp đã khám phá (và tại sao chúng không hoạt động)

  1. Xác minh liên kết giới thiệu so với tiêu đề máy chủ. - Sai vì người giới thiệu dễ bị làm giả.

  2. Sử dụng HMAC để tạo chữ ký dựa trên yêu cầu và bí mật được chia sẻ, sau đó xác minh yêu cầu trên máy chủ. - Sai phạm vì bí mật và thuật toán sẽ dễ dàng được xác định bằng cách xem xét JavaScript giao diện người dùng.

  3. Proxy yêu cầu và ký yêu cầu trong proxy - Vẫn còn sai sót, vì proxy chính nó làm lộ API.

Câu hỏi:

Tôi đang tìm kiếm những bộ óc xuất chúng trên Stack Overflow để đưa ra các giải pháp thay thế. Bạn sẽ giải quyết vấn đề này như thế nào?


13
Bạn không thể. Nếu việc sử dụng API của riêng bạn mà bạn không muốn bị giới hạn tỷ lệ chỉ đến từ các trang web công khai, thì bạn không thể thực hiện bất kỳ điều gì an toàn từ các trang web công cộng đó bởi vì, như bạn đã biết, có không có bí mật trong các trang web công khai. Vì vậy, những gì bạn có thể làm trong các trang web của mình, bất kỳ ai khác cũng vậy.
jfriend00

28
Bạn có chắc mình thực sự gặp vấn đề về giới hạn tỷ lệ cần giải quyết khi sử dụng thức ăn cho chó của mình không? Mỗi người dùng sử dụng trang web của bạn và các trang web của bạn sẽ có vẻ là một người dùng hoàn toàn khác với mã giới hạn tỷ lệ của bạn. Vì vậy, chỉ cần đảm bảo mỗi trang web hoạt động theo quy tắc giới hạn tốc độ bình thường của chính nó và bạn sẽ ổn. Giả sử giới hạn tỷ lệ của bạn là trên mỗi khách hàng, một người dùng sẽ không liên quan gì đến bất kỳ người dùng nào khác.
jfriend00

6
Tại sao bạn không xem xét giải pháp Quản lý API cung cấp giới hạn tỷ lệ và điều chỉnh trên phạm vi mỗi người dùng, mỗi vai trò / quyền hoặc ứng dụng. Ví dụ WSO2 api manger
MiddlewareManiac


28
Dogfooding của bạn đã phát hiện ra một vấn đề nghiêm trọng với API công khai của bạn (đó là giới hạn tỷ lệ quá thấp) và thay vì sửa nó, bạn đang cố gắng khắc phục vấn đề đó. Tại sao lại dùng dogfood nếu bạn định bỏ qua các vấn đề mà bạn tìm thấy?
dùng253751

Câu trả lời:


93

Vì ứng dụng JavaScript của riêng bạn đang truy cập trực tiếp vào API, nên bất kỳ ai cũng có thể xem nó đang làm gì và bắt chước nó, kể cả việc sử dụng cùng một khóa API. Bạn có thể cố gắng làm cho nó khó khăn hơn, như bằng cách làm xáo trộn mã của bạn hoặc đặt nhiều rào cản khác nhau, nhưng bạn và người mà bạn đang cố gắng hạn chế về cơ bản có cùng một quyền truy cập. Thay vì cố gắng tạo ra sự khác biệt trong các đặc quyền, bạn sẽ cần phải xây dựng một hệ thống mà hoàn toàn có thể chấp nhận được rằng khách hàng không chính thức sử dụng tất cả quyền truy cập trong phạm vi của nó, nhưng hệ thống được sắp xếp theo cách mà việc sử dụng chính thức trên tất cả các máy khách là lớn hơn.

Điều này thường được thực hiện với mã thông báo truy cập cho mỗi người dùng, trái ngược với một mã thông báo cho toàn bộ ứng dụng. Giới hạn của mỗi mã thông báo phải là nhiều cho việc sử dụng API thông thường của bạn, nhưng hạn chế đối với ai đó cố gắng lạm dụng nó. Ví dụ: 100 cuộc gọi mỗi phút có thể là quá đủ để hỗ trợ duyệt thông thường, nhưng nếu tôi muốn loại bỏ bạn, tôi không thể thực hiện hiệu quả với ngân sách đó.

Sẽ luôn có một cuộc chạy đua vũ trang - tôi có thể vượt qua giới hạn bằng cách tạo nhiều tài khoản người dùng bot. Tuy nhiên, đó là một vấn đề khá được giải quyết nếu bạn chỉ thêm hình ảnh xác thực vào quy trình đăng ký của mình, với một chút chi phí nhỏ so với con người thực. Khi bạn rơi vào những tình huống này, mọi thứ chỉ là sự cân bằng giữa sự thuận tiện và hạn chế. Bạn sẽ không bao giờ tìm thấy thứ gì đó hoàn toàn chống đạn, vì vậy hãy tập trung vào việc làm cho nó đủ tốt và đợi cho đến khi ai đó khai thác bạn để tìm hiểu vị trí của các lỗ.


8
Chấp nhận đây là câu trả lời tốt nhất. Lộ trình mà chúng tôi đã quyết định đi là sử dụng mã thông báo JWT với thời gian hết hạn thấp hơn và tăng giới hạn tỷ lệ của các cuộc gọi đó. Chúng tôi sẽ mã hóa một số thông tin bổ sung trong mã thông báo để cho phần phụ trợ biết về giới hạn tỷ lệ cao hơn. Vì các mã thông báo này được ký một cách an toàn trên chương trình phụ trợ, nên không có vấn đề gì với việc giả mạo. Ai đó vẫn có thể sử dụng mã thông báo, nhưng nó sẽ hết hạn sau vài ngày và việc duy trì bất kỳ loại bot nào sẽ khó thực hiện hơn.
Jason Waldrip

33

Nếu điều này gây ra cho bạn sự cố, nó sẽ gây ra vấn đề cho hệ sinh thái giả định của các nhà phát triển (ví dụ: khi họ cố gắng phát triển một giao diện người dùng thay thế). Nếu bạn đang thực sự ăn thức ăn cho chó của mình, hãy làm cho API (và giới hạn tỷ lệ) hoạt động cho ứng dụng của bạn. Đây là một vài gợi ý:

  • Không giới hạn tỷ lệ theo địa chỉ IP. Thay vào đó, giới hạn tỷ lệ bởi một cái gì đó được liên kết với người dùng, ví dụ: ID người dùng của họ. Áp dụng giới hạn tỷ lệ ở giai đoạn xác thực.

  • Thiết kế API của bạn để người dùng không cần gọi nó liên tục (ví dụ: đưa ra một lệnh gọi danh sách trả về nhiều kết quả, thay vì một lệnh gọi lặp lại trả về một mục mỗi lần)

  • Thiết kế ứng dụng web của bạn với những ràng buộc tương tự mà bạn mong đợi hệ sinh thái nhà phát triển của mình có, tức là đảm bảo bạn có thể thiết kế ứng dụng đó trong phạm vi điều chỉnh hợp lý.

  • Đảm bảo giao diện người dùng của bạn có thể mở rộng (tốt nhất là theo chiều ngang) để bạn không cần áp đặt điều chỉnh ở các mức thấp đến mức nó thực sự gây ra sự cố cho giao diện người dùng.

  • Đảm bảo bộ phận điều tiết của bạn có khả năng đối phó với các vụ nổ, cũng như hạn chế việc lạm dụng lâu dài hơn.

  • Đảm bảo bộ điều chỉnh của bạn thực hiện các hành động hợp lý phù hợp với hành vi lạm dụng mà bạn đang tìm cách xóa bỏ. Ví dụ: hãy xem xét việc xếp hàng hoặc trì hoãn những kẻ lạm dụng nhẹ hơn là từ chối kết nối. Hầu hết các giao diện người dùng web sẽ chỉ mở bốn kết nối đồng thời cùng một lúc. Nếu bạn trì hoãn nỗ lực mở thứ năm, bạn sẽ chỉ gặp phải trường hợp họ đang sử dụng CLI cùng lúc với ứng dụng khách web (hoặc hai ứng dụng khách web). Nếu bạn trì hoãn lệnh gọi API thứ n mà không có khoảng trống thay vì thất bại, người dùng cuối sẽ thấy mọi thứ chậm lại hơn là hỏng. Nếu bạn kết hợp điều này với chỉ xếp hàng N lệnh gọi API cùng một lúc, bạn sẽ chỉ đánh trúng những người đang thực hiện song song số lượng lớn các lệnh gọi API, điều này có thể không phải là hành vi bạn muốn - ví dụ: 100 lệnh gọi API đồng thời thì khoảng cách trong một giờ thường là xa tệ hơn 100 lệnh gọi API tuần tự trong hơn một giờ.

Điều này đã không trả lời câu hỏi của bạn? Chà, nếu bạn thực sự cần làm những gì mình yêu cầu, hãy giới hạn tỷ lệ ở giai đoạn xác thực và áp dụng một giới hạn tỷ lệ khác dựa trên nhóm người dùng của bạn phù hợp. Nếu bạn đang sử dụng một bộ thông tin xác thực (được sử dụng bởi các nhà phát triển và nhóm QA của bạn), bạn sẽ nhận được giới hạn tỷ lệ cao hơn. Nhưng bạn có thể thấy ngay lý do tại sao điều này chắc chắn sẽ dẫn bạn đến hệ sinh thái của bạn gặp các vấn đề mà nhà phát triển và nhóm QA của bạn không thấy.


11

Mua sản phẩm của bạn. Trở thành khách hàng trả phí của chính bạn.

"Quyền truy cập ẩn danh vào API của chúng tôi có ngưỡng rất thấp cho các cuộc gọi API mỗi giờ, trong khi khách hàng trả phí của chúng tôi được phép lên tới 1000 cuộc gọi mỗi giờ hoặc hơn."

Điều này cũng giúp kiểm tra hệ thống từ quan điểm của khách hàng.


1
Câu trả lời hiển nhiên. Không gian lận hoặc giả mạo ở đây!
wizzwizz 4

9

Thật không may, không có giải pháp hoàn hảo cho điều này.

Phương pháp chung thường là cung cấp spoofablecách để khách hàng tự nhận dạng (ví dụ: số nhận dạng, phiên bản và khóa API - ví dụ), để khách hàng đăng ký thông tin về chính họ có thể được sử dụng để giới hạn quyền truy cập (ví dụ: máy khách là máy chủ trong một dải địa chỉ IP nhất định, vì vậy chỉ cho phép người gọi trong phạm vi đó; ví dụ: máy khách là JavaScript, nhưng chỉ được phân phối đến một danh mục trình duyệt cụ thể, vì vậy chỉ cho phép truy cập vào các yêu cầu HTTP chỉ định một số chuỗi tác nhân người dùng nhất định; v.v.), sau đó sử dụng máy học / mẫu nhận dạng để phát hiện cách sử dụng bất thường có khả năng là một ứng dụng giả mạo và sau đó từ chối lưu lượng truy cập từ các ứng dụng giả mạo này (hoặc xác nhận với khách hàng rằng những sử dụng này thực sự không đến từ ứng dụng khách hợp pháp, thay thế thông tin đăng nhập giả mạo của họ và sau đó không cho phép tiếp tục lưu lượng truy cập bằng cách sử dụng cũ hơn thông tin đăng nhập giả mạo).

Bạn có thể làm cho việc giả mạo khó hơn một chút bằng cách sử dụng nhiều lớp khóa. Ví dụ: bạn cung cấp thông tin xác thực tồn tại lâu hơn trên máy chủ (và chỉ có thể được sử dụng trong một tập hợp giới hạn các dải địa chỉ IP) để thực hiện lệnh gọi API ghi lại thông tin về máy khách (ví dụ: tác nhân người dùng) và trả về một khóa phía máy khách có tuổi thọ ngắn hơn được cung cấp trong JavaScript để sử dụng trên máy khách cho các yêu cầu API phía máy khách. Điều này cũng không hoàn hảo (một spoofer có thể đưa ra cùng một lệnh gọi máy chủ để lấy thông tin xác thực), nhưng sẽ khó khăn hơn nếu khóa API trả về được bao gồm trong JavaScript hoặc HTML bị xáo trộn (và thường xuyên thay đổi) (điều này sẽ gây khó khăn để trích xuất một cách đáng tin cậy từ phản hồi). Điều đó cũng cung cấp một cách để dễ dàng phát hiện giả mạo hơn; khóa phía máy khách hiện được gắn với một máy khách cụ thể (ví dụ:


8

Giả sử ứng dụng được đề cập phải được mở công khai, bạn không có nhiều lựa chọn:

Chọn một cách khác để chứng minh sức mạnh của API của bạn. Ví dụ: viết một ứng dụng như vậy và chia sẻ nguồn của nó, nhưng không thực sự chạy mã đó. Tuy nhiên, hãy đảm bảo rằng nó được ghi chép đầy đủ để bất kỳ ai cũng có thể triển khai nó và thấy nó hoạt động (tùy thuộc vào điều chỉnh).

Ứng dụng bạn chạy sẽ cần được cấu trúc lại để tránh các yêu cầu API phía máy khách và được máy chủ hiển thị nhiều hơn. Bạn vẫn có thể dogfood API của mình, nhưng không phải theo cách rõ ràng — thực hiện các yêu cầu an toàn đối với API không cần điều chỉnh từ phía máy chủ.

Điều chỉnh giới hạn tỷ lệ để cho phép ứng dụng của bạn hoạt động và đầu tư vào tối ưu hóa hiệu suất để xử lý tải.

Và đúng vậy, ngay từ đầu hãy sử dụng API cốt lõi không cần điều chỉnh và giữ nó bên trong một mạng riêng. Tiết lưu trong một lớp có thể truy cập công khai riêng biệt.


4

Bạn có thể thiết lập một phiên bản riêng biệt của giao diện người dùng và API miễn phí, sau đó hạn chế quyền truy cập vào các địa chỉ IP đến từ tổ chức của bạn không?

Ví dụ: triển khai toàn bộ nội dung đằng sau tường lửa công ty của bạn và đính kèm ứng dụng vào cơ sở dữ liệu giống như phiên bản công khai nếu bạn cần chia sẻ dữ liệu giữa các phiên bản.


4

Bạn có thể cố gắng tạo một ID phiên duy nhất, bị ràng buộc với một địa chỉ IP / người dùng nhất định và thời gian tồn tại có hạn. Khi người dùng tải xuống mã JavaScript giao diện người dùng ứng dụng của bạn, hãy đưa ID phiên đã tạo vào mã nguồn JavaScript. ID phiên sẽ được đính kèm với mọi yêu cầu tới API của bạn và giới hạn tốc độ sẽ được dỡ bỏ.

Không thể đơn giản sao chép ID để giả mạo, vì nó chỉ hợp lệ cho một địa chỉ IP, người dùng và lượng thời gian giới hạn. Vì vậy, kẻ thù sẽ phải gọi trang của bạn và lọc ra khóa từ nguồn JavaScript của bạn hoặc chặn yêu cầu Ajax mỗi khi người dùng mới muốn sử dụng nó.

Một lựa chọn khác:

Thiết lập proxy cho ứng dụng của riêng bạn và sử dụng tính năng obfuscation. Các yêu cầu Ajax tới proxy sử dụng các tên khác với các lệnh gọi API thực và proxy sẽ dịch ngược lại chúng. Vì vậy, ứng dụng của bạn sẽ không gọi getDocumenttrên API thực của bạn, nhưng nó sẽ gọi getFELSUFDSKJEtrên proxy của bạn. Proxy sẽ dịch cuộc gọi này trở lại getDocument và chuyển tiếp nó tới API giới hạn tốc độ thực tế.

API thực tế của bạn sẽ không yêu cầu giới hạn tỷ lệ bởi proxy.

Và để những người khác không sử dụng proxy của bạn cho ứng dụng của riêng họ, bạn thay đổi sơ đồ gây rối loạn hàng ngày. Các tên gọi xáo trộn có thể được tạo tự động trong mã nguồn JavaScript của bạn và được định cấu hình trong proxy.

Một khách hàng muốn sử dụng cái này, cũng sẽ cần theo kịp sự thay đổi của bạn để sử dụng proxy của bạn. Và bạn vẫn có thể sử dụng tiêu đề liên kết giới thiệu và tương tự để ghi nhật ký, vì vậy bạn có thể tìm thấy những người sử dụng proxy của mình. Hoặc bắt chúng khi thay đổi lược đồ obfuscation.


3
  • Danh sách trắng địa chỉ IP nguồn
  • Sử dụng VPN , đưa các thành viên VPN vào danh sách trắng
  • Giải pháp proxy hoặc addon trình duyệt có thêm tiêu đề HTTP sẽ ổn nếu bạn có thể bảo mật proxy và không lo ngại về các cuộc tấn công MITM đánh hơi lưu lượng truy cập
  • Bất kỳ giải pháp nào liên quan đến bí mật đều có thể giảm thiểu tác động của rò rỉ bằng cách luân phiên các bí mật hàng ngày

Các giải pháp này không áp dụng cho máy khách web giao diện người dùng. Hoàn hảo nếu truy cập API ở chế độ phụ trợ.
Jason Waldrip

@ Jason tất cả họ đều có thể được áp dụng cho một lối vào
the8472

2

Thiết lập nhiều tài khoản và chọn một trong số chúng ngẫu nhiên theo mọi yêu cầu hoặc thay đổi tài khoản bạn sử dụng mỗi giờ hoặc lâu hơn. Bằng cách này, bạn có thể phân phối tải cho ncác tài khoản, mang lại cho bạnn giới hạn cao hơn gấp nhiều lần.

Hãy cẩn thận về việc vô tình tự tắt nếu bạn đang cố gắng tìm thấy những người dùng khác đang làm điều này, nếu điều đó không được phép đối với khách hàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.