Đây là một vấn đề kinh điển với các trò chơi và cuộc thi trên Internet. Mã Flash của bạn hoạt động với người dùng để quyết định điểm cho trò chơi. Nhưng người dùng không tin cậy và mã Flash chạy trên máy tính của người dùng. Bạn là SOL. Bạn không thể làm gì để ngăn kẻ tấn công giả mạo điểm số cao:
Flash thậm chí còn dễ dàng hơn để thiết kế đảo ngược so với bạn nghĩ, vì các mã byte được ghi lại tốt và mô tả một ngôn ngữ cấp cao (Actioncript) --- khi bạn xuất bản một trò chơi Flash, bạn sẽ xuất bản mã nguồn của mình, cho dù bạn biết hay không
Kẻ tấn công kiểm soát bộ nhớ thời gian chạy của trình thông dịch Flash, để bất kỳ ai biết cách sử dụng trình gỡ lỗi lập trình đều có thể thay đổi bất kỳ biến nào (bao gồm cả điểm hiện tại) bất cứ lúc nào hoặc thay đổi chính chương trình.
Cuộc tấn công đơn giản nhất có thể đối với hệ thống của bạn là chạy lưu lượng HTTP cho trò chơi thông qua proxy, bắt lưu điểm số cao và phát lại với điểm số cao hơn.
Bạn có thể cố gắng chặn cuộc tấn công này bằng cách ràng buộc mỗi lần lưu điểm cao vào một phiên bản duy nhất của trò chơi bằng cách gửi mã thông báo được mã hóa đến máy khách khi khởi động trò chơi, có thể giống như:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(Bạn cũng có thể sử dụng cookie phiên để có hiệu lực tương tự).
Mã trò chơi lặp lại mã thông báo này trở lại máy chủ với mức lưu điểm cao. Nhưng kẻ tấn công vẫn có thể khởi động lại trò chơi, nhận mã thông báo và sau đó dán ngay mã thông báo đó vào bản lưu điểm số cao được phát lại.
Vì vậy, tiếp theo bạn cung cấp không chỉ mã thông báo hoặc cookie phiên, mà còn là khóa phiên mã hóa điểm cao. Đây sẽ là khóa AES 128 bit, được mã hóa bằng khóa được mã hóa cứng trong trò chơi Flash:
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
Bây giờ trước khi trò chơi đăng điểm cao, nó sẽ giải mã khóa phiên mã hóa điểm cao, điều này có thể làm được vì bạn đã mã hóa khóa mã hóa điểm cao-khóa-giải mã-khóa-mã hóa thành khóa nhị phân Flash. Bạn mã hóa điểm số cao bằng khóa được giải mã này, cùng với hàm băm SHA1 của điểm số cao:
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
Mã PHP trên máy chủ kiểm tra mã thông báo để đảm bảo yêu cầu đến từ một phiên bản trò chơi hợp lệ, sau đó giải mã điểm cao được mã hóa, kiểm tra để đảm bảo điểm cao phù hợp với SHA1 của điểm cao (nếu bạn bỏ qua bước này , giải mã đơn giản sẽ tạo ra ngẫu nhiên, có khả năng rất cao, điểm số cao).
Vì vậy, bây giờ kẻ tấn công dịch ngược mã Flash của bạn và nhanh chóng tìm thấy mã AES, nó giống như ngón tay cái đau, mặc dù ngay cả khi nó không bị theo dõi trong 15 phút với tìm kiếm bộ nhớ và theo dõi ("Tôi biết Điểm của tôi cho trò chơi này là 666, vì vậy, hãy tìm 666 trong bộ nhớ, sau đó bắt bất kỳ thao tác nào chạm vào giá trị đó --- ồ nhìn kìa, mã hóa điểm số cao! "). Với khóa phiên, kẻ tấn công thậm chí không phải chạy mã Flash; cô ấy lấy mã thông báo khởi động trò chơi và khóa phiên và có thể gửi lại điểm cao tùy ý.
Bây giờ bạn đang ở thời điểm mà hầu hết các nhà phát triển chỉ từ bỏ --- cho hoặc mất một vài tháng để gây rối với những kẻ tấn công bằng cách:
Xáo trộn các phím AES với các thao tác XOR
Thay thế các mảng byte chính bằng các hàm tính toán khóa
Phân tán mã hóa khóa giả và bài đăng điểm cao trong toàn bộ nhị phân.
Tất cả điều này chủ yếu là một sự lãng phí thời gian. Không cần phải nói, SSL cũng sẽ không giúp bạn; SSL không thể bảo vệ bạn khi một trong hai điểm cuối SSL là xấu.
Dưới đây là một số điều thực sự có thể làm giảm gian lận điểm cao:
Yêu cầu đăng nhập để chơi trò chơi, đăng nhập sẽ tạo cookie phiên và không cho phép nhiều lần khởi chạy trò chơi nổi bật trên cùng một phiên hoặc nhiều phiên đồng thời cho cùng một người dùng.
Từ chối điểm số cao từ các phiên trò chơi kéo dài ít hơn các trò chơi thực tế ngắn nhất từng chơi (đối với cách tiếp cận tinh vi hơn, hãy thử "cách ly" điểm số cao đối với các phiên trò chơi kéo dài dưới 2 độ lệch chuẩn dưới thời lượng trò chơi trung bình). Hãy chắc chắn rằng bạn đang theo dõi thời lượng máy chủ trò chơi.
Từ chối hoặc cách ly điểm số cao khỏi các thông tin đăng nhập chỉ chơi trò chơi một hoặc hai lần, để kẻ tấn công phải tạo ra một "vệt giấy" chơi trò chơi tìm kiếm hợp lý cho mỗi lần đăng nhập mà chúng tạo.
Điểm số "Heartbeat" trong khi chơi trò chơi, để máy chủ của bạn nhìn thấy sự tăng trưởng điểm số trong suốt thời gian chơi một trò chơi. Từ chối điểm số cao không tuân theo các đường cong điểm số hợp lý (ví dụ: nhảy từ 0 đến 999999).
Trạng thái trò chơi "Ảnh chụp nhanh" trong khi chơi trò chơi (ví dụ: số lượng đạn dược, vị trí trong cấp độ, v.v.), mà sau đó bạn có thể điều hòa với điểm số tạm thời được ghi lại. Bạn thậm chí không phải có cách để phát hiện sự bất thường trong dữ liệu này để bắt đầu; bạn chỉ cần thu thập nó, và sau đó bạn có thể quay lại và phân tích nó nếu mọi thứ trông có vẻ tanh.
Vô hiệu hóa tài khoản của bất kỳ người dùng nào không thực hiện một trong các kiểm tra bảo mật của bạn (ví dụ: bằng cách gửi điểm cao được mã hóa mà không xác thực).
Tuy nhiên, hãy nhớ rằng bạn chỉ ngăn chặn gian lận điểm cao ở đây. Có gì bạn có thể làm để ngăn chặn nếu. Nếu có tiền trong trò chơi của bạn, ai đó sẽ đánh bại bất kỳ hệ thống nào bạn nghĩ ra. Mục tiêu không phải là để ngăn chặn cuộc tấn công này; đó là để làm cho cuộc tấn công trở nên đắt đỏ hơn là chỉ thực sự giỏi trò chơi và đánh bại nó.