스코어 보드에 사기 제출을 방지합니다
-
21-08-2019 - |
문제
나는 플래시 게임을 위해 백엔드를 작업하고 있습니다. 안전한 스코어 보드로 들어가는 데이터.
이 게임은 배너 광고의 많은 사이트에서 호스팅 될 예정이며, 사용자는 광고에서 게임을 플레이 한 다음 기본 사이트로 클릭하여 세부 정보를 저장합니다.
지금 나는 이것의 선을 따라 생각하고있다
- 사용자는 게임을하고 클릭하여 점수를 제출합니다.
- 백그라운드에서 배너는 점수와 원산지 도메인을 기본 사이트의 스크립트로 보냅니다.
- 스크립트 확인 도메인은 광고가 호스팅되는 유효한 도메인 중 하나입니다.
- 모든 것이 옳은 경우, 스크립트는이 점수와 도메인의 해시를 생성하고 점수와 함께 데이터베이스에 저장합니다.
- 스크립트는 해시를 플래시로 반환하여 메인 스코어 보드를 열어주는 geturl의 쿼리 스트링에 자갈을두고 있습니다.
- 스코어 보드 페이지는 참조자가 유효한 도메인 중 하나인지 확인합니다.
- 그렇다면 유효한 토큰 인 경우 해시의 데이터베이스를 확인합니다.
- 그런 다음 사용자는 세부 사항을 채우고 레코드는 해시에 따라 업데이트됩니다.
지난번에 Flash를 확인하면 참조 정보를 보내지 않습니다. 그렇다면 이러한 종류의 플래시/데이터베이스 상호 작용에 대해 이미 확립 된 패턴이 있습니까?
4 단계에서 어떤 종류의 해싱/체크 스모핑을 사용해야합니까? 이런 종류의 작업의 올바른 이름은 무엇입니까? 해시, 체크섬 또는 다른 것입니까?
나는 Clientside 기술이기 때문에 Flash는 실제로 그렇게 안전하지 않을 것이라는 것을 이해하지만, 내 마음에 위의 것과 같은 것은 이런 종류의 응용 프로그램을 해킹 할 수있는 것만 큼 감동적입니다.
업데이트 : 내 주요 목표는 사람들이 스크립트의 URL을 찾기가 더 어렵게 만드는 것입니다.
고마워, 그렉
해결책
나는 이전에 게임 업계에서 일 했으며이 라인을 따라 무언가를했습니다. 내가 아는 한, 아무도 부품을 제출하는 점수를 크래킹하는 것을 귀찮게하지 않았습니다.
그 방법은 다음과 같습니다.
- 소금으로 임의의 숫자를 생성하십시오 (플래시에서)
- 소금 (플래시에서)을 기준으로 수학 작업을 사용하여 점수를 인코딩하십시오.
- 점수를 추가하여 점수에 템퍼링이 없는지 확인하십시오 (플래시에서)
- 점수와 필요한 데이터를 점수 제출 페이지로 보내십시오.
- 서버에서 체크섬을 사용하여 점수가 강화되지 않았 음을 확인합니다.
- 점수가 유효하다면 데이터베이스에 삽입하십시오.
- 원한다면 체크섬을 위반하는 점수 제출자의 IP 주수를 기록 할 수 있습니다 (아마도 3 개의 나쁜 체크섬 정책이 나올 수도 있습니다). 스크립트를 추가하여 1 시간에 서버에 액세스하는 것을 금지하는 스크립트를 추가 할 수 있습니다. 누군가가 당신의 코드를 그 나쁜 코드를 깨고 싶지 않다면 필요합니다.
참고 : 해싱 / 체크 스모킹은 사용자 정의 기능을 사용하여 만들어졌습니다. 매우 안전한 것이 필요하지 않았습니다. 소금과 점수에 계산을 사용하여 만들어졌습니다. 합계, 곱셈 및 뺄셈과 같은 간단한 수학 작업.
편집하다: 체크섬에 대한 간단한 알고리즘 / 수학
사용자의 점수가 있다고 가정 해 봅시다 5885.
당신은 소금으로 임의의 숫자를 생성합니다 134789 (일정한 길이, 0 인 패드)
암호화 = 점수 * 소금 (여기서 좀 더 복잡한 것을 사용해야하지만 예시적인 일입니다)
이 예에서 암호화 된 점수는 다음과 같습니다. 793233265
이제 체크섬의 경우 값을 갖고 싶다고 가정 해 봅시다. 253 체크섬으로.
당신은 암호화 된 점수의 모든 숫자를 추가합니다. 7+9+3+2+3+3+2+6+5 = 40
이제이 점수에 대한 체크섬의 값을 계산합니다.
253 - (암호화 점수 숫자의 합계 % 253)
이제 다음 숫자가 있습니다.
소금 = 134789
암호화 된 점수 = 793233265
체크섬 = 40
서버에 요청하여 보내는 것입니다 134789793233265040 점수로.
점수 서버에서 나눌 수 있습니다 793233265 ~에 의해 134789 기부 5885 이전과 동일한 함수를 사용하여 체크섬을 확인하십시오.
체크섬이 실패하면 숫자가 변조되었습니다.
당신은 아마도 훨씬 더 안전한 것으로 끝날 수 있지만, 그것은 트릭을 수행해야합니다.
다른 팁
기본적으로 당신은 합법적 인 클라이언트에서 점수가오고 있는지 확인하고 싶지 않습니다. 클라이언트가 실제로 게임을 플레이하여 점수를 달성했는지 확인하려고합니다. 본질적으로 당신이 기대할 수있는 최선의 방법은 사람들이 게임을하기 위해 AI를 만들어야한다는 것입니다.
다음은 시도 할 수있는 몇 가지 사항입니다.
- 입력을 게임에 로그인하고 점수와 함께 그것들을 보내십시오. 그런 다음 서버는 점수가 가능한 게임에 해당하는지 확인할 수 있습니다. 이 방법으로 중복 제출을 감지 할 수도 있습니다.
- 고객이 명백히 비인간적 인 속도로 점수를 제출하는 것을 막기 위해 요금 제한을 적용하십시오. 실제로 달성 할 수있는 것과 초당 동작과 같은 것들에 대한 하한을 기준으로 허용 가능한 점수에 상한을 적용하십시오.
- 이전 입력을 사용하여 의사 임의 번호 생성기를 부분적으로 시드하십시오 (사용한다고 가정). 이로 인해 고객이 제출물을 약간 변경하고 여전히 유효한 게임/점수 콤보를 얻을 수 있습니다.