Hãy tưởng tượng một vấn đề: Tôi có dịch vụ REST, được triển khai bằng cách sử dụng công nghệ Java/MySQL/Spring và HTTP/JSON. Các khách hàng của dịch vụ REST là các ứng dụng di động. Vì vậy, có thể ai đó sẽ dịch ngược mã và sẽ nhận được API của dịch vụ REST. (Có, mã bị làm mờ, v.v.).Dịch vụ REST và điều kiện chủng tộc
Sự cố: có phương thức POST để gửi tiền cho người dùng khác của ứng dụng. Tôi lo lắng rằng ai đó có thể lấy API, viết bot và thực hiện yêu cầu POST này 500 hoặc 5.000 hoặc thậm chí 50.000 lần mỗi giây. Kết quả là, anh ta có thể gửi nhiều tiền hơn anh ta thực sự có, bởi vì nếu 1000 yêu cầu được xử lý đồng thời thì kiểm tra số dư có thể là thành công cho tất cả 1000 yêu cầu, tuy nhiên số tiền thực trên tài khoản có thể chỉ đủ, cho phép nói, 50 yêu cầu.
Vì vậy, về cơ bản, nó giống với điều kiện "đua" chuẩn với nhiều chuỗi. Vấn đề là, tôi có nhiều máy chủ và chúng không liên quan với nhau. Vì vậy, 300 yêu cầu có thể đến máy chủ A, 300 yêu cầu có thể đến máy chủ B và các yêu cầu còn lại có thể đến máy chủ C.
Ý tưởng hay nhất là sử dụng cái gì đó như "CHỌN ... CẬP NHẬT" và đồng bộ hóa ở cấp cơ sở dữ liệu. Tuy nhiên, tôi muốn xem xét các giải pháp khác.
Bất kỳ ý tưởng hoặc đề xuất nào?
Đừng bạn có thông tin đăng nhập, phiên và tokens chống CSRF để đảm bảo rằng các yêu cầu chuyển giao chỉ có thể đến từ một đăng nhập, người dùng được ủy quyền? Bạn không có kiểm tra ủy quyền để đảm bảo rằng chỉ yêu cầu chuyển tiền của riêng mình được tôn trọng? Bạn không có một ứng dụng ba tầng vì vậy giao diện người dùng chỉ xử lý lớp trình bày và logic nghiệp vụ được xử lý đằng sau hậu trường? Bạn không có khả năng phân đoạn xử lý cho các yêu cầu như vậy (cùng một nhà tài trợ, cùng một mục tiêu, vv) tất cả trong một máy chủ logic nghiệp vụ duy nhất? – atk
Cách đăng nhập/phiên có thể ngăn điều này? Nếu ai đó hack API, anh ta có thể hack đăng nhập/phiên và gửi yêu cầu này bằng cơ chế xác thực hợp lệ. Nhân tiện, xác thực là dựa trên mã thông báo, tức là OAuth. Đó là một dịch vụ REST và tôi không sử dụng thẻ csrf. – user3489820
Nếu bạn có người đăng nhập, và hạn chế mọi thứ để mọi người chỉ có thể tiêu tiền của riêng mình, thì bạn ngăn chặn các cuộc tấn công mà kẻ tấn công sẽ tiêu tiền của người khác. Nó không ngăn cản họ rút tiền từ tài khoản của chính họ, nhưng nó ngăn họ rút tiền * tài khoản * của người khác. – atk