Bảo mật dữ liệu HTTP từ trò chơi JavaScript đến máy chủ


8

Giả sử tôi đang làm một trò chơi JavaScript và tôi muốn trò chơi cập nhật máy chủ nếu người dùng đã hoàn thành trò chơi và kết quả của anh ta.

Làm cách nào để đảm bảo rằng yêu cầu đến từ trò chơi JavaScript và dữ liệu được gửi không bị giả mạo. Tôi đang sử dụng PHP làm ngôn ngữ phía máy chủ.

Tôi hiểu rằng không có chiến lược nào sẽ được chứng minh 100%, và bất kỳ biện pháp nào được thực hiện đều mang tính răn đe hơn là bảo vệ tuyệt đối.

Trên Chỉnh sửa: Giả sử chúng tôi không sử dụng xác minh máy chủ của từng bước của người dùng (như trong MMO truyền thống). Trò chơi có thể là một trò chơi nhỏ như một phần của trò chơi web hoặc trò chơi giáo dục (ví dụ như kẻ xâm lược không gian hoặc trò chơi thời gian thực) và yêu cầu một thành phần phía máy chủ cho mỗi trò chơi đó có thể rất tẻ nhạt.

Ví dụ: Giả sử, khi trò chơi hoàn thành, một yêu cầu được gửi đến máy chủ thông qua. AJAX

game_finished.php?user_id=1&outcome=success&score=88

Một người dùng có thể 'giả mạo' máy chủ để tin rằng trò chơi đã được hoàn thành chính xác bằng cách gửi yêu cầu đó đến game_finished.php. Làm thế nào điều này có thể được thực hiện khó khăn hơn?

Câu trả lời:


10

một câu đố khối trượt, ví dụ

Đây là một ví dụ trong đó xác minh phía máy chủ là tầm thường. Không cần xác minh từng bước cho đến khi trò chơi kết thúc. Chỉ cần gửi toàn bộ danh sách di chuyển, và máy chủ phát lại nó để đảm bảo chính xác.

(Chỉnh sửa: Điểm của câu trả lời này không phải là chọn ví dụ cho đến khi bạn tìm thấy một ví dụ không hợp lệ. Thay vào đó, nó sẽ khiến bạn quay lại và nhìn vào trò chơi mà bạn thực sự đang thực hiện - nó có thể có giá trị tầm thường, hoặc chỉ cần một tinh chỉnh nhỏ để được.)


Tôi đã suy nghĩ về ví dụ và nó không phải là ví dụ tốt nhất. Hãy nói rằng Kẻ xâm lược không gian sau đó. Tôi sẽ cập nhật câu hỏi.
Extrakun

2
Chuyển động của Space Invaders cũng hoàn toàn mang tính quyết định. Bạn chỉ cần ghi lại khi mỗi cặp bắn / trúng xảy ra, mô phỏng chuyển động cho đến thời điểm đó (đó là một phương trình tuyến tính đơn giản) và đảm bảo rằng nó thực sự là một cú đánh.

Cuối cùng tôi đã hiểu ý bạn sau khi nghĩ về nó. Cảm ơn
Extrakun

Chỉ là một bổ sung cho khía cạnh "hoàn toàn xác định": Nếu bạn cần sự ngẫu nhiên trong trò chơi của mình, hãy chuyển một hạt giống cụ thể cho tính ngẫu nhiên đó cho khách hàng và lưu hạt giống đó trên máy chủ. Khi khách hàng gửi nhật ký chơi trò chơi để xác nhận, máy chủ cũng có thể phát lại các phần liên quan đến tính ngẫu nhiên. Điều tương tự là có thể cho các bước phụ thuộc vào thời gian địa phương. Xem các thuật toán lưu và tải của Undum ( undum.com ) như một ví dụ về cách thực hiện điều này trong JavaScript.
BerndBrot

2

Bạn có thể làm theo cách Warcraft: Chỉ sử dụng Javascript để gửi lệnh di chuyển đến máy chủ và để máy chủ xử lý logic.

Điều này vẫn khiến bạn mở ra cho robot (các chương trình javascript giúp di chuyển mọi thứ nhanh hơn chính xác hơn con người) nhưng đó là một bước tiến lớn so với việc để cánh cửa mở cho thủ thuật /game_finished.php.


1

Nếu bạn đang yêu cầu khách hàng tính điểm, không có cách nào để xác thực nó ngoài (như đã chỉ ra) khi máy chủ phát lại trò chơi để xác nhận rằng nó có cùng số điểm.

Mặc dù có nhiều loại trò chơi bạn có thể thiết kế không hoạt động dựa trên chỉ số điểm. Ví dụ, một kịch bản phía máy chủ có thể tạo ra một vấn đề toán học bổ sung ngẫu nhiên và khi người dùng gửi câu trả lời, nó có thể so sánh câu trả lời của họ với câu trả lời đúng và chấm điểm cho phía máy chủ.

Nhưng nếu trò chơi của bạn là một trò chơi phức tạp (như ví dụ về kẻ xâm lược không gian), bạn sẽ không thể làm được gì nhiều ngoài việc a) tin tưởng khách hàng, hoặc b) để máy chủ quản lý trò chơi.


-1

Có nhiều phương pháp, nhưng cuối cùng tất cả chúng sẽ thất bại. Bạn có thể thêm một số giá trị băm hoặc khóa truy vấn được gia hạn với mỗi truy vấn.

Nhưng điều quan trọng nhất là, tất cả các chức năng siêu mã hóa của bạn được gửi dưới dạng mã nguồn đến trình duyệt của khách hàng và đó là vấn đề. Để làm cho nó khó hơn một chút, bạn có thể sử dụng chức năng gửi bằng truy vấn Ajax, vì vậy các nguồn sẽ không có sẵn dưới một url. Chức năng nên được gửi nén, và thậm chí có thể trong các phần, vì vậy sẽ khó hơn để sao chép tất cả. Tôi cũng sẽ kiểm tra mã này trong trang như http://jsbeautifier.org/ nếu sau khi làm cho nó dễ đọc, mã của bạn rất dễ hiểu.

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.