태그 보관물: javascript

javascript

HTML5 게임에서 서버로 점수를 보내는 것을 어떻게 보호합니까? 백엔드에서 Java를 사용하고 있습니다. HTML5 게임이

백엔드에서 Java를 사용하고 있습니다. HTML5 게임이 있습니다. 사용자가 완료하면 Ajax 호출을 보내 점수를 데이터베이스에 저장합니다. 이제 누군가는 Fiddler 및 firebug와 같은 도구를 쉽게 사용 하여이 아약스 요청을 수정하고 서버에 훨씬 더 나은 점수를 보낼 수 있습니다. 사용자가 점수를 조작 할 수 없도록하려면 어떻게합니까?



답변

정수 점수를 서버로 보내지 마십시오. 점수가 현실적인지 확인하는 데 사용할 수있는 게임 통계 모음을 보냅니다. 또는 사전 공유 키를 구현할 수 있습니다 점수를 계산하기 위해 를 . 게임 전반에 걸쳐 증분 점수와 통계를 보내고 증가가 합당한 지 확인할 수 있습니다.

그러나 나는 그것에 대해 너무 걱정하지 않을 것입니다. 위의 제안은 어렵지만 가짜 점수를 보내는 것은 불가능하지 않습니다. 그러나 게임을 플레이하는 대다수의 사람들이 약간의 어려움을 겪으면 속임수에 관심이 없습니다.

게임이 서버와 통신하는 방법에주의하십시오. 게임이 해킹을위한 서버의 진입 점이되기를 원하지 않습니다. 항상 입력 내용의 유효성을 검사하고 클라이언트를 신뢰하지 마십시오.


답변

Byte56이 말했듯이 : “클라이언트를 신뢰하지 마십시오”.

고객을 절대 믿지 마십시오.
서버에서 모든 게임을 플레이하면 인프라 비용이 많이 증가합니다.

대부분의 플레이어가 속이지 않고
최고 점수가 약간의 시간 후에 정착하고 많은 변화를 중단 한다고 가정합니다.

중간 방법이 있습니다.

클라이언트 에서 게임을 기록하십시오 .
(매우 쉬우거나 (예 : 체스) 약간 복잡 할 수있는 (예 : 멀티 플레이어 FPS) 게임 유형에 따라
항상 가능합니다.)

플레이어가 게임을 마치면 점수를 제출하십시오.
점수가 상위 (예 : 상위 1 % 또는 상위 5)의 특정 범위 내에있는
경우 플레이어에게 기록 된 데이터를 요청
하고 서버에서 해당 게임을 재생하십시오.
점수가 일치하면 점수를 수락하십시오.

이런 식으로 대부분의 연극에 추가 서버 측 리소스가 필요하지 않지만
최고 점수가 유효한지 확인할 수 있습니다.


답변

그것에 대해 걱정하지 마십시오; 클라이언트를 신뢰하는 경우 모든 공격으로부터 보호하는 것은 본질적으로 불가능합니다. 아무도 Fiddler 등을 사용하여 AJAX 요청을 수정하지 않으면 JS 디버거를 실행하고 게임 데이터를 수정하여 자신에게 1000 생명 등을 주거나 코드를 수정하거나 생각하지 않은 100 가지 다른 일을 할 수 있습니다.

나는 몇 년 전에 그런 게임을 썼고, 내가 아는 한, 아무도 이런 식으로 속이지 않았습니다. 점수 표에 귀하의 이름이있는 것을 제외하고는 상이 없었습니다.


답변

예를 들어 사회적 리더 보드를 사용하여 속임수에 대한 사회적 동기를 줄입니다 (속임수는 당신을 소수의 친구들에게만 어울리게 만들뿐 모든 사람을 망치지 않습니다).

서버에서 확인하십시오. Joel Poloney는 게임 개발자 2012 년 9 월 “온라인 게임 확장” 에서 기술을 잘 작성했습니다.


답변

치트 방지 온라인 게임을 만들려면 서버의 모든 게임 논리를 처리해야합니다. 클라이언트 측에서 발생하는 모든 것은 사용자가 제어하고 조작 할 수 있습니다. 암호화 또는 난독 화와 같은 기술을 시도해 볼 수 있지만 결국에는 충분히 결정된 사람이 우회 할 수있는 모호함을 통한 보안입니다.

물론 서버에서 실행되는 게임은 개발하기가 훨씬 복잡하고 서버 측에서 더 많은 리소스가 필요하며 네트워크 대기 시간은 게임 경험 (특히 빠른 속도의 게임의 경우)에 해롭지 만 효과적인 방법은 아닙니다. 플레이어가 부정 행위하는 것을 방지합니다.


답변