브라우저 / HTML5 게임을위한 치트 방지 자바 스크립트


35

js / html5에서 단일 플레이어 액션 롤 플레잉을 만들려고 계획 중이며 부정 행위를 방지하고 싶습니다. 멀티 플레이 게임이 아니기 때문에 100 % 보호가 필요하지는 않지만 어느 정도의 보호가 필요합니다.

그렇다면 축소 및 난독 화를 넘어서 어떤 전략을 제안합니까?

서버 측을 간단하게 확인하고 싶지는 않지만 서버 측에서 모든 게임 상태 변경 사항을 유지하는 Diablo 3 경로를 가고 싶지 않습니다.

그것은 롤 플레잉 일 것이므로 값의 갑작스러운 변화를 확인하는 통계 관리자를 만드는 아이디어를 생각해 냈지만 어떻게 일관성 있고 신뢰할 수 있는지 잘 모르겠습니다.

변수 및 함수 범위는 어떻습니까? 가능할 때마다 작은 escope에서 작업하는 것이 더 안전하지만 그만한 가치가 있습니까?

어쨌든 자바 스크립트가 체크섬과 같이 텍스트를 자체 검사 할 수 있습니까?

브라우저 별 솔루션이 있습니까? 초기 빌드에서만 Chrome을 제한하지 않습니다.


데이터는 어디에 저장됩니까? 데이터는 어떻게 저장됩니까?
DogDog

"Diablo 1 way"는 고객을 신뢰하는 Diable 3에 대한 이야기입니다. 너무 어려서 Google 검색으로 인해 발생한 일을 기억하십시오!
Valmond


Apoc, 지금 나는 개념 증명을 가지고 있으며 어떤 종류의 지속성을 구현하지 않았습니다. 그러나 플레이어는 처음 빌드 및 / 또는 로컬 스토리지에서 DB 지속성을 구현하여 플레이어가 왼쪽에서 계속 재생할 수 없도록 계획합니다. 예, Valdmond 나는 당시 디아블로에서 내 몫을했습니다. 그러나 나는 경쟁적인 멀티 플레이어 게임 또는 풀 플래그 AAA를 구축하지 않습니다. Byte56, 나는 내 코드를 훔치는 것에 대해 걱정하지 않는다. (누가 그 쓰레기를 원 할까?)
Billy Ninja

안타깝게도 해킹 / 속임수에 관심이 있다면 디아블로 3 길을 가야합니다.
Noob Game Developer

답변:


46

짧은 대답은 당신이 그것을 할 수 없다는 것입니다. 클라이언트 측, 특히 소스에서 실행되는 모든 것을 수정하여 전술을 사소하게 물리 칠 수 있습니다. 갑작스러운 변경 사항을 찾기 위해 클라이언트 측 검사기를 설치하면 사용자는 검사기를 비활성화 할 수 있습니다.

좋은 소식은 일반적으로 싱글 플레이어 게임에 대한 부정 행위가 거의 없다는 것입니다. 플레이어가 YouTube를 통해 서로 경쟁하는 Line Rider와 같은 대규모 "youtube 최고 점수"커뮤니티가있는 게임의 유일한 예외입니다.

만약 당신이 그것을 목표로하고 있거나 사람들이 게임에서 부정 행위를 할 수 있다는 것을 받아들이기에는 너무 고집이 났거나 자신 (고급 플레이어의 형태)을 최고 점수로 유지하고 있다면 서버 측의 모든 계산이 필요합니다. . 네, 모든 것이 중요합니다. 계산 클라이언트 측을 반복하여 사용자에게 점수를 부여한 다음 서버를 사용하여 점수를 '확인'하려고 시도 할 수도 없습니다. 사용자는 검사를 비활성화하고 검사가 필요한 시스템을 비활성화 할 수 있기 때문입니다.

이에 대한 더 나은 답변이 있었으면 좋겠지 만 그렇지 않습니다.

즉, 속임수를 조금 더 어렵게 만들기 위해 할 수있는 일이 있습니다. 그들은 심각한 일을하는 사람을 막고 속임수를 내기위한 툴킷을 공개하지는 않지만 속도를 늦출 것입니다.

  • JS를 축소하고 난독 처리하면 코드를 읽기가 더 어려워집니다. 난독 화 및 난독 처리를 해제 할 수는 있지만 올바른 변수 및 함수 이름이나 주석을 다시 가져올 수는 없습니다.
  • 다른 언어로 값을 구우십시오. 이 경우 PHP 또는 다른 서버 측 언어를 사용하여 정적 설정 변수를 처리 할 수 ​​있습니다. 점프 거리가 항상 2 칸인 경우, 일반적으로 플레이어 오브젝트의 점프 거리를 정의합니다. PHP로 처리하지 마십시오 .JS 소스는 코드 전체에 백만 곳의 석고가 2 개로 마감됩니다. 이것은 JS 속도를 높일 수 있다는 추가적인 부작용이 있습니다.
  • 약간의 연습으로 믹스에 능숙 해지며 각 플레이어에 맞게 JS를 사용자 정의 할 수도 있습니다. 부정 행위를 방지하는 또 다른 방법입니다. 각 플레이어의 코드가 어떻게 든 다르면 툴킷의 일부일 수있는 치트를 작성하기가 더 어렵습니다.
  • 마지막으로 플레이어의 신원을 기반으로 소스를 체크섬 할 수 있습니다. 그들의 IP 주소 및 / 또는 사용자 이름을 말하십시오. JS의 플레이어 특정 버전이 무엇인지 알고, 체크섬을 굽고 반대쪽에서도 동일하게 요구할 수 있습니다. 클라이언트 쪽 JS처럼 쉽게 비활성화 할 수 있지만 다시 한 번 툴킷을 만드는 것이 조금 더 어려워집니다.

그래서. 보시다시피,이 길을가는 것은 가치가 없을 것입니다. 그것은 어렵다. 실제로 어리석은 코딩 방법이 많이 필요하며 궁극적으로는 여전히 쉽게 패배 할 수 있습니다. 부정 행위를 방지하기 위해 서버 측에서 모든 계산을 수행해야합니다. 아니면 가자 속임수가 일어날 것이라는 사실을 받아들이십시오.


라인 라이더 예제는 실제로 사용자가 그린 맵을 업로드하고 점수를 계산할 수있게함으로써 서버 측에서는 매우 사소한 일입니다. 그러나 아케이드와 같은 게임은 광범위한 작업없이 점수를 서버 측에서 계산하는 것이 거의 불가능합니다.
orlp

@nightcracker 그러나 Line Rider와 같은 경우에도 정확합니다. 게임이 끝난 후에 만 ​​확인하면 비디오가 만들어지고 YouTube가 이미 Duped되었습니다. 사용자가 플레이를하려고 할 때지도를 업로드하고 사소한 경로를 계산 한 다음 다시 보내야합니다. 게임은 경로를 계산할 수 없어야합니다. (만약 우리가 그 속임수를 속이는 증거로 만드는 것에 대해 이야기한다면, 그 속임수가 팬들에게 명백 할 정도로 간단합니다.)
DampeS8N

14

나는 이미 here 와 같은 질문에 대답했으며 , 죄송하지만

서버 측을 간단하게 확인하고 싶지는 않지만 서버 측에서 모든 게임 상태 변경 사항을 유지하는 Diablo 3 경로를 가고 싶지 않습니다.

여기서 가장 나쁜 말입니까? "치트 방지"엔진을 사용하려면 그렇게해야합니다. 서버 측 작업을 용이하게하기 위해 원하는 클라이언트 측을 추가 할 수 있지만 클라이언트를 절대 신뢰해서는 안됩니다. 가지고있는 모든 논리는 최소한 서버 쪽이어야합니다. 원하는 경우 클라이언트 측에서 재생할 수 있지만 클라이언트 측에서만 해결책이 없습니다.

그런데 프로그램의 약점을 찾으려면 난독 화하지 말고 사람들이 코드를보고 "여기에 문제가 있습니다"라고 말하십시오.

그것은 당신, 코드, 사용자 및 지역 사회에 좋습니다.


3
서버 권한 +1, 클라이언트를 신뢰하려고하면 작동하지 않습니다 ...
Valmond

클라이언트 쪽을 재현하는 것은 위험합니다. 모든 것이 클라이언트 측에서 복제되면 사용자는 서버와 수표의 연결을 해제하여 부정 행위를 할 수 있으므로주의하십시오. 그런 다음 게임을하고 비디오를 녹화하며 YouTube 스타가 될 수 있습니다. 이 게임은 싱글 플레이어 게임에만 적용됩니다.
DampeS8N

클라이언트쪽에 대해 이야기 할 때, 그것은 "움직임 계산", "충돌"등입니다. 이것은 멀티 플레이어 게임에서도 가능합니다. 서버 측 계산은 항상 우선 순위로 간주해야하지만, 클라이언트 측도 서버 대기 시간이있을 때 도움이 될 수 있습니다. 그러나 "치트 체크"로직 인 모든 것에 대해서는 모든 것이 서버 측이어야한다는 데 동의합니다.
dievardump

그래, 알았어 그러나 나는 내가 가진 작은 자유 시간에 취미로 프로젝트를하고 있습니다. 이런 종류의 서버 검사를 수행하면 프로젝트가 복잡해져 불가능 해집니다. 글쎄, 나는 프로젝트를 계속해서 알고 있고, 그것이 더 커지고 심각해지기 시작하면 심각한 서버 측 제어, 아마도 Node.js를 생각해 낼 수있는 것보다 더 커질 것입니다.
Billy Ninja

이것은 OP에 대한보다 적절한 답변입니다.
Noob 게임 개발자

3

시작하기에 좋은 곳은 Object.freeze 기능 을 사용 하는 것입니다 (오브젝트 패치 방지 기능 사용 ).

"새 속성 추가 방지", "기존 속성 제거 방지", "기존 속성 또는 열거 가능성, 구성 가능성 또는 쓰기 가능성 변경 방지"; 내부 상태에 대한 모든 변경은 접근자를 통해 수행해야합니다. 다음 예제는 크롬에서 작동합니다 (파이어 폭스에서 작동해야하지만 IE에 대해서는 모르겠습니다 ...).

var b = {}
// Fill your object with whatever you want
b.a = "ewq"
// Freeze all changes
Object.freeze(b)
// Try to put new value. This wont throw any error, put wont work either, 
// as we shall see ...
b.b = "qwe"

// Values 
console.log(b.a); // outputs "eqw"
console.log(b.b); // outputs  undefined

5
이조 차도 결정된 사기꾼의 속도를 늦출뿐입니다. 다른 방법으로 소스를 훔칠 수 없다면 자신의 컴퓨터에서 소스를 호스팅하고 고정 코드를 제거한 다음 호스트 파일을 사용하여 새 페이지가 이전 페이지라고 생각하도록 브라우저를 속여 서버와 다시 연결하십시오.
DampeS8N

@ DampeS8N 네, 당신이 옳은 것 같아요.
fableal

내가 OP에서 말했듯이, 난 그냥 원하는 몇 가지 보호 수준을.
Billy Ninja

이것은 전혀 도움이되지 않습니다! 사용자는 첫 번째 JS 함수에서 디버거 중단 점을 설정 Object.freeze = function(o) {};하면 JS 콘솔에서 실행되고 입력 됩니다.
Philipp

2

불행히도, 실제로 해킹 / 속임수에 관심이 있다면 디아블로 3 길을 가야합니다. 그렇지 않은 경우 기본 점검을 수행하거나 수행 할 것을 강력히 권고합니다.

  • 수표 구매-무언가를 구매하는 경우 충분한 금이 있어야합니다
  • sellchecks-물건을 팔고 있다면 재고 거래 체크에 해당 품목이 있어야합니다-무기 판매와 동일
  • 장비 점검-무기를 장비하고 있다면 소유하고 있습니까?
  • 데미지 체크-내가 무언가를 공격하는 경우 (적) 무기에 입힐 수있는 최대 데미지보다 더 많은 타격을 입을 수 없습니다.
  • 수공예 검사-무언가를 제작 한 경우 필요한 모든 재료 / 성분이 있습니까?

... 등등

1 점은 조금 까다 롭습니다. 영웅의 위치는 당신이 그것을 걱정할 필요가 없기 때문에 남겨 둘 수는 있지만, 아래의 것과 같은 최소 점검으로도 더 잘 수행하는 것이 좋습니다

  • 나는 place1 @ T1에 있고 place2 T2에 있습니다. place1에서 place2까지 이동하는 데 걸리는 최소 시간은 얼마이며 T2-T1과 일치합니다. 맵 크기에 따라이를 작게에서 크게로 맵핑 할 수 있습니다. NPC-보스, NPC-적 스폰 지역과 같은 주요 지역의 목록이 있어야합니다 (정확한 위치는 아닙니다)

이것이 도움이 되길 바랍니다. 어렵게 들리지만 실제 작동하는 게임을 만드는 법을 배워야합니다.


좋은 답변입니다! 서버 검사를 구현하는 것이 얼마나 어려운지를 측정하기 위해 서버 검사를 구현하는 방법에 대한 질문을 작성했습니다. 알다시피, MMO와 같은 백본을 구현하는 데 수십 시간을 낭비하고 싶지 않으며 하루가 끝날 때 클라이언트 요청 매개 변수 또는 이와 유사한 것을 재정 의하여 쉽게 쉽게 해결할 수 있습니다. 또는 단순히 더 멋진 기능을 제공하거나 사물을 연마하는 대신 보안에 낭비되는 단순한 재미있는 게임이었던 것을 과장했습니다.
Billy Ninja

1

기본적으로 불가능합니다. 부정 행위를 방지하기 위해 배치 한 모든 것을 해결하는 것이 매우 쉽습니다.

사람들이 배포하는 모든 소프트웨어를 사용하면 메모리에서 쉽게 수정할 수 있습니다.

그들이 바람 피고 싶어하는 것 외에, 그들을 보자. 그들은 스스로 게임을 망치고 있습니다. 이 상황에서 부정 행위를하는 실제적인 용도는 없습니다. 게임 플레이를 직접 파괴하면됩니다.


1

부정 행위를 예방 / 감소시키기 위해 취할 수있는 조치에 대한 아이디어가있었습니다. 고객에게 한 번에 모든 소스 코드가 제공되지 않도록, 클라이언트가 상점에서 새 항목을 구매할 때마다 클라이언트가 특정 정보를 보내도록 할 수 있도록 설정할 수 있습니다. 정보가 모든 정보와 일치하는 경우 구매 한 제품에 대한 모든 정보를 수신합니다. 그렇지 않은 경우 서버는 IP 또는 다른 것을 블랙리스트에 추가합니다.

Dampes8n이 다른 소스 버전을 사용하는 것에 대해 말한 것과 함께 이것을 사용할 수 있습니다. 다른 버전을 많이 생성하는 방법을 알아낼 수 있다면 각 사용자가 매번 완전히 다른 소스 버전을 실행하여 해당 소스 버전의 블랙리스트를 확인하여 해당 소스 버전에 대한 올바른 항목 정보를 다시 제공하지 않습니다.

이것이 효과적인 주된 이유는 해커가 처음으로 해킹을 제대로받지 못하면 해킹이 완벽하게 작동하지 않을 때마다 해킹을 수정하기가 훨씬 더 어려워지기 때문입니다. 새로운 소스 버전을 위해 IP를 변경하고 해킹을 다시 작성하십시오.


조심 할게 마지막으로하고 싶은 것은 실수로 유료 고객을 영구 금지하는 것입니다.
John McDonald

@JohnMcDonald 사실입니다. 아마도 그 소스 버전을 죽일 것입니다. 그렇게하면 실수로 트랩을 트리거하면 브라우저를 새로 고치면 해커가 여전히 모든 해킹을 다시 코딩하게됩니다.
AJMansfield

0

예, 완전히 할 수 없습니다 . 항상 서버를 확인하십시오. 게임에 영향을주는 것은 서버의 승인이 필요합니다.

그것은 내가 다른 대답을 반복 할 연장입니다.

그러나 우리는 단지 서버를 확인하는 것보다 치트를 막기 위해 많은 것을 할 수 있습니다. 특별한 서버 검사를 추가해야 할 수도 있습니다. 그러나 클라이언트 측 점검은 가치가 없으며 사기꾼이 관여하지 않을 때 대역폭과 서버 작업을 절약합니다.

그것으로 말했다 :

  • 거친 클라이언트 완화 : HTTPS를 통해 제공하고 CORS (Cross-origin Resource Sharing)를 사용하고 동일한 출처 만 허용하고 하위 자원 무결성을 사용하십시오. 서비스 워커를 구현하여 모든 요청에 ​​적용하도록 제안합니다. 이는 단순히 HTTP로 이동하여 게임이 작동하지 않음을 의미합니다 (HTTPS가 없으면 서비스 워커가 없기 때문에 서버 워커가 CORS와 서버는 CORS를 기대합니다)) HTTPS를 통해 서비스를 제공하면 서버가 다른 출처를 거부하므로 작동하지 않습니다.
  • 스크립팅 완화 : 인증을 사용하고 작업을 수행하려면 토큰이 필요합니다. 각 업데이트주기마다 서버는 클라이언트에게 새로운 토큰을 제공해야하며, 토큰은 무엇이든 무엇이든함으로써 소비됩니다. 유효한 토큰이 필요하고 토큰은 항상 변경되므로 추측 할 수 없으며 클라이언트가 동일한 토큰을 두 번 보내거나 서버가 무언가 잘못되었음을 알고 잘못된 토큰을 보냅니다. 추가 보호 : 비밀 키를 사용하여 토큰의 메시지 인증 코드 (MAC)를 생성하고 쿠키에 추가하십시오. 쿠키를 수정하면 세션이 종료되고 (키를 추측해야 함) 토큰을 수정하면 MAC 확인이 실패합니다.
  • 코드 수정 완화 : 하위 리소스 무결성 (현대 브라우저도 런타임에서 확인) 외에도 변수를 제한된 범위 (let, 자체 실행 익명 함수 및 javascript 모듈 사용)로 유지합니다. 또한 DOM에 의존하지 마십시오 (DOM은 속성을 첨부하고 DOM 오브젝트를 랩핑하고 랩퍼에 추가해야하는 경우 스토리지가 아니라 IO 전용입니다). 이런 식으로, 어떤 브라우저 취약점을 악용하지 않는 한 콘솔의 모든 것이 게임 로직에 도달 할 수 없어야합니다. 또한 개발자 도구를 탐지하기위한 기술 사용을 고려할 수도 있습니다 (브라우저마다 다르며, 모든 경우에 작동하지 않거나 향후 작동을 멈출 수 있습니다. 따라서 이는 무력 경쟁입니다).
  • 뭔가있어? 세션이 중단 되었습니까? 현재 경기에서 선수를 걷어차 고 다시 로그인을 요청하십시오. 사용자에게 " 임의의 서버가 아님 을 알고 있습니다"라는 말을하는 이점이 있습니다 (예 : 임의의 서버 오류가 아님). 아, 그리고 이것을 기록하기 위해 안개를 뿌리지 마십시오. 허위 게시물을 방지하고 지원 티켓에 응답하기 위해 왜 그런 일이 있었는지 확인할 수 있어야합니다.

예, 이것은 모두 완화입니다. 우리는 여전히 무결성을 검사하지 않고 로컬 범위의 변수에 도달하고 엉망으로 만들 수있는 맞춤형 브라우저를 가질 수 있습니다 ... 그런 다음 게임 코드는 올바른 토큰으로 수정 된 데이터를 보내며 서버 검사가 시작됩니다 놀이.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.