복붙노트

사람들이 플래시 게임의 PHP 기반 최고 점수 테이블을 해킹하는 것을 막는 가장 좋은 방법은 무엇입니까?

PHP

사람들이 플래시 게임의 PHP 기반 최고 점수 테이블을 해킹하는 것을 막는 가장 좋은 방법은 무엇입니까?

나는 상위 점수 제한이없는 액션 게임에 대해 이야기하고 있습니다. 움직임 등을 재생하여 서버의 점수를 확인할 방법이 없습니다.

필자가 정말로 필요로하는 것은 Flash / PHP에서 가능한 가장 강력한 암호화이며, Flash 파일을 통해 PHP 페이지를 호출하는 것을 방지하는 방법입니다. 과거에 하나의 점수에 대해 여러 번 호출하고 체크섬 / 피보나치 시퀀스를 완료하고 Amayeta SWF Encrypt로 SWF를 난독 화하는 간단한 방법을 시도했지만 결국 해킹되었습니다.

StackOverflow 응답 덕분에 Adobe에서 더 많은 정보를 얻었습니다. http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html 및 https://github.com/mikechambers/as3corelib - 제가 생각하기에 암호화에 사용할 수 있습니다. CheatEngine을 통해이 사실을 알게 될지 확신하지 못합니다.

서로 다른 경우 AS2와 AS3 모두를위한 최상의 솔루션을 알아야합니다.

주요 문제는 Tamper Data 및 Live HTTP 헤더와 같은 것으로 보이지만 Cheat Engine과 같은 고급 해킹 도구도 있다는 것을 알고 있습니다 (Mark Webster에게 감사드립니다)

해결법

  1. ==============================

    1.이것은 인터넷 게임 및 컨테스트에서 발생하는 고전적인 문제입니다. Flash 코드는 사용자와 함께 게임 점수를 결정합니다. 그러나 사용자는 신뢰할 수 없으며 사용자의 컴퓨터에서 Flash 코드가 실행됩니다. 당신은 SOL입니다. 공격자가 높은 점수를 얻는 것을 막을 수있는 방법은 없습니다.

    이것은 인터넷 게임 및 컨테스트에서 발생하는 고전적인 문제입니다. Flash 코드는 사용자와 함께 게임 점수를 결정합니다. 그러나 사용자는 신뢰할 수 없으며 사용자의 컴퓨터에서 Flash 코드가 실행됩니다. 당신은 SOL입니다. 공격자가 높은 점수를 얻는 것을 막을 수있는 방법은 없습니다.

    시스템에 대한 가장 간단한 공격은 프록시를 통해 게임에 대한 HTTP 트래픽을 실행하고 높은 점수 저장을 잡아서 높은 점수로 재생하는 것입니다.

    게임 시작시 클라이언트에 암호화 된 토큰을 보냄으로써 높은 점수 저장을 게임의 단일 인스턴스에 바인딩하여이 공격을 차단할 수 있습니다.

    hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
    

    (동일한 효과를 내기 위해 세션 쿠키를 사용할 수도 있습니다).

    게임 코드는이 토큰을 고득점 저장으로 서버에 다시 에코합니다. 그러나 공격자는 여전히 게임을 다시 시작하고 토큰을 얻은 다음 해당 토큰을 재생 된 최고 점수 저장에 즉시 붙여 넣을 수 있습니다.

    다음으로는 토큰 또는 세션 쿠키뿐만 아니라 높은 점수 암호화 세션 키도 제공합니다. 128 비트 AES 키입니다. 플래시 게임에 하드 코딩 된 키로 암호화됩니다.

    hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
    

    게임이 높은 점수를 게시하기 전에 상위 점수 암호화 세션 키를 암호 해독합니다. 이는 높은 점수 암호화 세션 키 해독 키를 플래시 이진으로 하드 코드했기 때문에 가능합니다. 최고 점수의 SHA1 해시와 함께 해독 된 키를 사용하여 최고 점수를 암호화합니다.

    hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
    

    서버의 PHP 코드는 토큰을 검사하여 요청이 유효한 게임 인스턴스에서 왔는지 확인한 다음 암호화 된 높은 점수를 해독하고 높은 점수가 높은 점수의 SHA1과 일치하는지 확인합니다 (이 단계를 건너 뛰면 , 암호 해독은 무작위, 가능성이 매우 높은, 높은 점수를 단순히 생성합니다).

    이제 공격자는 플래시 코드를 디 컴파일하여 AES 코드를 신속하게 찾습니다. 메모리 검색 및 추적 프로그램을 사용하여 15 분 이내에 추적 할 수 없더라도 아픈 엄지 손가락처럼 튀어 나오게됩니다 ( "알고 있습니다. 이 게임에 대한 나의 점수는 666이므로, 기억에서 666을 찾은 다음, 그 가치에 부합하는 모든 작업을 포착하자 --- 높은 점수의 암호화 코드! "). 세션 키로 공격자는 플래시 코드를 실행할 필요조차 없습니다. 그녀는 게임 실행 토큰과 세션 키를 잡고 임의의 높은 점수를 돌려 보낼 수 있습니다.

    이제 대부분의 개발자가 포기한 지점에 있습니다. 공격자와 몇 달 간 어지럽히거나 포기할 수 있습니다.

    이것은 대부분 시간 낭비입니다. 그것은 말할 것도없이, SSL은 당신을 돕지 않을 것입니다. 두 개의 SSL 엔드 포인트 중 하나가 위험한 경우 SSL로 사용자를 보호 할 수 없습니다.

    실제로 높은 점수 사기를 줄일 수있는 몇 가지 사항이 있습니다.

    여기에서 고득점 사기를 막을 뿐이라는 것을 기억하십시오. 당신을 예방할 수있는 방법은 없습니다. 게임에서 돈이 라인에 있다면, 누군가 당신이 떠오르는 시스템을 이길 것입니다. 목표는이 공격을 막는 것이 아닙니다. 게임을 실제로 잘하고 그것을 때리는 것보다 공격을 더 비싸게 만드는 것입니다.

  2. ==============================

    2.잘못된 질문을하고있을 수도 있습니다. 사람들이 높은 점수를 올리는 데 사용하는 방법에 초점을 맞춘 것 같지만 특정 방법을 차단하는 것은 지금까지만 진행됩니다. 나는 TamperData에 대한 경험이 없으므로 그 말을 할 수 없습니다.

    잘못된 질문을하고있을 수도 있습니다. 사람들이 높은 점수를 올리는 데 사용하는 방법에 초점을 맞춘 것 같지만 특정 방법을 차단하는 것은 지금까지만 진행됩니다. 나는 TamperData에 대한 경험이 없으므로 그 말을 할 수 없습니다.

    질문해야 할 질문은 : "제출 된 점수가 유효하고 확실하다는 것을 어떻게 확인할 수 있습니까?" 이를 수행하는 구체적인 방법은 게임에 따라 다릅니다. 매우 간단한 퍼즐 게임의 경우 특정 시작 상태 및 종료 상태가 된 이동 순서와 함께 점수를 전송 한 다음 동일한 동작을 사용하여 서버 측에서 게임을 다시 실행할 수 있습니다. 명시된 점수가 계산 된 점수와 동일한 지 확인하고 일치하는 경우에만 점수를 수락하십시오.

  3. ==============================

    3.이를 수행하는 쉬운 방법은 자신의 점수와 함께 최고 점수 값의 암호화 해시를 제공하는 것입니다. 예를 들어, HTTP GET을 통해 결과를 게시 할 때 : http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

    이를 수행하는 쉬운 방법은 자신의 점수와 함께 최고 점수 값의 암호화 해시를 제공하는 것입니다. 예를 들어, HTTP GET을 통해 결과를 게시 할 때 : http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

    이 체크섬을 계산할 때 공유 암호를 사용해야합니다. 이 비밀은 결코 네트워크를 통해 전송되어서는 안되지만 PHP 백엔드와 플래시 프론트 엔드 둘 다에서 하드 코딩되어야합니다. 위의 체크섬은 문자열 "secret"을 스코어 "500"에 붙이고 md5sum을 통해 실행함으로써 만들어졌습니다.

    이 시스템은 사용자가 임의의 점수를 게시하는 것을 방지하지만 사용자가 이전에 계산 된 점수와 해시 조합을 다시 게시하는 "재생 공격"을 막지는 못합니다. 위의 예에서 500 점은 항상 동일한 해시 문자열을 생성합니다. 이 위험 중 일부는 해시 할 문자열에 자세한 정보 (예 : 사용자 이름, 타임 스탬프 또는 IP 주소)를 통합하여 완화 할 수 있습니다. 이렇게해도 데이터 재생을 막을 수는 없지만 한 세트의 데이터는 한 번에 한 명의 사용자에게만 유효합니다.

    재생 공격이 발생하지 않도록하려면 다음과 같은 몇 가지 유형의 시도 - 응답 시스템을 만들어야합니다.

    공유 비밀에 사용자가 액세스 할 수없는 경우 위의 기술 중 하나의 보안이 손상된다는 점에 유의하십시오.

    대안으로 클라이언트가 HTTPS를 통해 서버와 통신하도록 강요하고 클라이언트가 독점적으로 액세스 할 수있는 특정 인증 기관에서 서명 한 인증서 만 신뢰하도록 미리 설정하여이 앞뒤를 피할 수 있습니다 .

  4. ==============================

    4.나는 tpqf가 말한 것을 좋아하지만 부정 행위가 발견 될 때 계정을 사용 중지하는 대신 허니팟을 구현하므로 로그인 할 때마다 해킹 된 점수를보고 트롤로 표시되었음을 의심하지 않습니다. "phpBB MOD Troll"에 대한 Google은 독창적 인 접근 방식을 보게됩니다.

    나는 tpqf가 말한 것을 좋아하지만 부정 행위가 발견 될 때 계정을 사용 중지하는 대신 허니팟을 구현하므로 로그인 할 때마다 해킹 된 점수를보고 트롤로 표시되었음을 의심하지 않습니다. "phpBB MOD Troll"에 대한 Google은 독창적 인 접근 방식을 보게됩니다.

  5. ==============================

    5.수락 된 답변에서 tqbf는 점수 변수에 대한 메모리 검색 만 할 수 있다고 언급합니다 ( "내 점수는 666이므로 메모리에서 666을 찾습니다").

    수락 된 답변에서 tqbf는 점수 변수에 대한 메모리 검색 만 할 수 있다고 언급합니다 ( "내 점수는 666이므로 메모리에서 666을 찾습니다").

    이 문제를 해결할 방법이 있습니다. 여기 수업이 있습니다 : http://divillysausages.com/blog/safenumber_and_safeint

    기본적으로 점수를 저장할 개체가 있습니다. setter에서는 전달한 값에 임의의 숫자 (+ 및 -)를 곱하고 게터에서 저장된 값을 임의의 곱하기로 나눠 원래 값으로 되돌립니다. 간단하지만 메모리 검색을 중지하는 데 도움이됩니다.

    또한 해킹과 싸울 수있는 여러 가지 방법에 대해 이야기하는 PushButton 엔진 뒤에있는 사람들의 동영상을 확인하십시오. http://zaa.tv/2010/12/the-art-of-hacking-flash- 계략/. 그들은 수업 뒤에서 영감을주었습니다.

  6. ==============================

    6.알려진 (비공개) 가역 키를 사용하여 암호화하는 것이 가장 간단한 방법입니다. 나는 모든 AS가 아니므로 어떤 종류의 암호화 공급자가 있는지 확실하지 않습니다.

    알려진 (비공개) 가역 키를 사용하여 암호화하는 것이 가장 간단한 방법입니다. 나는 모든 AS가 아니므로 어떤 종류의 암호화 공급자가 있는지 확실하지 않습니다.

    하지만 게임 길이 (암호화 된, 다시) 및 클릭 수와 같은 변수를 포함 할 수 있습니다.

    이런 모든 일은 리버스 엔지니어링 될 수 있으므로 사람들을 그 향기에서 벗어나기 위해 수많은 정크 데이터를 던지십시오.

    편집 : 그것은 너무 PHP 세션에서 chucking 가치가있을 수도 있습니다. 그들이 게임 시작을 클릭하고 (이 게시물에 대한 코멘트가 말하듯이) 시간을 기록 할 때 세션을 시작하십시오. 그들이 점수를 제출할 때 실제로 게임이 열려 있고 점수를 너무 일찍 또는 너무 크게 제출하지 않았는지 확인할 수 있습니다.

    최대 스펠이 초당 / 분당 플레이인지 스칼라로 알아내는 것이 좋습니다.

    이 두 가지 모두는 할례가 없지만 사람들이 볼 수있는 플래시가 아닌 어떤 논리를 갖는 데 도움이 될 것입니다.

  7. ==============================

    7.제 경험상, 이것은 프로그래밍 문제보다는 사회 공학 문제로 가장 잘 접근합니다. 속임수를 쓰지 못하게 만드는 데 집중하는 대신 사기극에 대한 인센티브를 제거하여 지루하게 만드는 데 집중하십시오. 예를 들어, 주요 인센티브가 공개적으로 볼 수있는 고득점 인 경우 높은 점수가 표시 될 때 지연을두면 사기꾼에 대한 긍정적 인 피드백 루프를 제거하여 부정 행위를 크게 줄일 수 있습니다.

    제 경험상, 이것은 프로그래밍 문제보다는 사회 공학 문제로 가장 잘 접근합니다. 속임수를 쓰지 못하게 만드는 데 집중하는 대신 사기극에 대한 인센티브를 제거하여 지루하게 만드는 데 집중하십시오. 예를 들어, 주요 인센티브가 공개적으로 볼 수있는 고득점 인 경우 높은 점수가 표시 될 때 지연을두면 사기꾼에 대한 긍정적 인 피드백 루프를 제거하여 부정 행위를 크게 줄일 수 있습니다.

  8. ==============================

    8.클라이언트가 반환하는 데이터는 신뢰할 수 없습니다. 유효성 검사는 서버 측에서 수행해야합니다. 저는 게임 개발자가 아니지만 비즈니스 소프트웨어를 만듭니다. 두 경우 모두 돈이 소요될 수 있고 사람들은 클라이언트 쪽 난독 화 기술을 깨뜨릴 것입니다.

    클라이언트가 반환하는 데이터는 신뢰할 수 없습니다. 유효성 검사는 서버 측에서 수행해야합니다. 저는 게임 개발자가 아니지만 비즈니스 소프트웨어를 만듭니다. 두 경우 모두 돈이 소요될 수 있고 사람들은 클라이언트 쪽 난독 화 기술을 깨뜨릴 것입니다.

    어쩌면 데이터를 주기적으로 서버로 보내고 유효성을 검사합니다. 응용 프로그램 코드가 어디에 있더라도 클라이언트 코드에 집중하지 마십시오.

  9. ==============================

    9.나는 일종의 해결 방법을 만들었습니다. 나는 점수가 증가하는 곳을주었습니다 (항상 +1 점수를 얻습니다). 첫째, 무작위로 숫자를 계산하기 시작했습니다 (14 개라고 가정 해 봅니다). 점수를 표시 할 때 점수는 14에서 마이너스 14로 나타났습니다. 크래커가 20을 위해 예제를 찾고 있다면 찾지 못할 것입니다. 메모리에서 34가됩니다). 둘째로, 다음 요점이 무엇인지 알아야하기 때문에 ... 어도비 암호화 라이브러리를 사용하여 다음 요점이 무엇인지 해시를 작성해야합니다. 점수를 증가시켜야 할 때, 증가 된 점수의 해시가 해시와 같아야하는지 확인합니다. 크래커가 메모리의 포인트를 변경하면 해시가 동일하지 않습니다. 서버 측 검증을 수행하고 게임과 PHP에서 다른 점을 얻었을 때, 나는 속임수가 관련되어 있다는 것을 알고 있습니다. 여기에 내 코드의 스 니펫입니다 (저는 Adobe Crypto libraty MD5 클래스와 임의의 암호화 salt를 사용하고 있습니다.) callPhp ()는 서버 측 유효성 검사입니다.

    나는 일종의 해결 방법을 만들었습니다. 나는 점수가 증가하는 곳을주었습니다 (항상 +1 점수를 얻습니다). 첫째, 무작위로 숫자를 계산하기 시작했습니다 (14 개라고 가정 해 봅니다). 점수를 표시 할 때 점수는 14에서 마이너스 14로 나타났습니다. 크래커가 20을 위해 예제를 찾고 있다면 찾지 못할 것입니다. 메모리에서 34가됩니다). 둘째로, 다음 요점이 무엇인지 알아야하기 때문에 ... 어도비 암호화 라이브러리를 사용하여 다음 요점이 무엇인지 해시를 작성해야합니다. 점수를 증가시켜야 할 때, 증가 된 점수의 해시가 해시와 같아야하는지 확인합니다. 크래커가 메모리의 포인트를 변경하면 해시가 동일하지 않습니다. 서버 측 검증을 수행하고 게임과 PHP에서 다른 점을 얻었을 때, 나는 속임수가 관련되어 있다는 것을 알고 있습니다. 여기에 내 코드의 스 니펫입니다 (저는 Adobe Crypto libraty MD5 클래스와 임의의 암호화 salt를 사용하고 있습니다.) callPhp ()는 서버 측 유효성 검사입니다.

    private function addPoint(event:Event = null):void{
                trace("expectedHash: " + expectedHash + "  || new hash: " + MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt) );
                if(expectedHash == MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt)){
                    SCORES +=POINT;
                    callPhp();
                    expectedHash = MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt);
                } else {
                    //trace("cheat engine usage");
                }
            }
    

    이 기술을 사용 + SWF obfustication, 나는 크래커를 막을 수있었습니다. 또한 서버 측에 점수를 보낼 때 필자는 자체적으로 작은 암호화 / 암호 해독 기능을 사용합니다. 다음과 같은 (서버 측 코드는 포함되어 있지 않지만, 알고리즘을 보거나 PHP로 작성할 수 있습니다) :

    package  {
    
        import bassta.utils.Hash;
    
        public class ScoresEncoder {
    
            private static var ranChars:Array;
            private static var charsTable:Hash;
    
            public function ScoresEncoder() {
    
            }
    
            public static function init():void{
    
                ranChars = String("qwertyuiopasdfghjklzxcvbnm").split("")
    
                charsTable = new Hash({
                    "0": "x",
                    "1": "f",
                    "2": "q",
                    "3": "z",
                    "4": "a",
                    "5": "o",
                    "6": "n",
                    "7": "p",
                    "8": "w",
                    "9": "y"
    
                });
    
            }
    
            public static function encodeScore(_s:Number):String{
    
                var _fin:String = "";
    
                var scores:String = addLeadingZeros(_s);
                for(var i:uint = 0; i< scores.length; i++){
                    //trace( scores.charAt(i) + " - > " + charsTable[ scores.charAt(i) ] );
                    _fin += charsTable[ scores.charAt(i) ];
                }
    
                return _fin;
    
            }
    
            public static function decodeScore(_s:String):String{
    
                var _fin:String = "";
    
                var decoded:String = _s;
    
                for(var i:uint = 0; i< decoded.length; i++){
                    //trace( decoded.charAt(i) + " - > "  + charsTable.getKey( decoded.charAt(i) ) );
                    _fin += charsTable.getKey( decoded.charAt(i) );
                }
    
                return _fin;
    
            }
    
            public static function encodeScoreRand(_s:Number):String{
                var _fin:String = "";
    
                _fin += generateRandomChars(10) + encodeScore(_s) + generateRandomChars(3)
    
                return _fin;
            }
    
            public static function decodeScoreRand(_s:String):Number{
    
                var decodedString:String = _s;
                var decoded:Number;
    
                decodedString = decodedString.substring(10,13);         
                decodedString = decodeScore(decodedString);
    
                decoded = Number(decodedString);
    
                return decoded;
            }
    
            public static function generateRandomChars(_length:Number):String{
    
                var newRandChars:String = "";
    
                for(var i:uint = 0; i< _length; i++){
                    newRandChars+= ranChars[ Math.ceil( Math.random()*ranChars.length-1 )];
                }
    
                return newRandChars;
            }
    
            private static function addLeadingZeros(_s:Number):String{
    
                var _fin:String;
    
                if(_s < 10 ){
                     _fin = "00" + _s.toString();
                }
    
                if(_s >= 10 && _s < 99 ) {
                     _fin = "0" + _s.toString();
                }
    
                if(_s >= 100 ) {
                    _fin = _s.toString();
                }           
    
                return _fin;
            }
    
    
        }//end
    }
    

    그런 다음 다른 가짜 변수로 변수를 보내면 길을 잃어 버리게됩니다. 단지 작은 플래시 게임에 많은 작업이 있지만 상금이 관련되어있는 경우 일부 사람들은 단지 욕심을 갖습니다. 도움이 필요하시면, 저에게 PM을 써주세요.

    건배, Ico

  10. ==============================

    10.최고 점수 시스템이 Flash 응용 프로그램이 네트워크를 통해 암호화되지 않은 / 서명되지 않은 최고 점수 데이터를 전송한다는 사실을 기반으로 할 때마다 차단 및 조작 / 재생할 수 있습니다. 해답은 다음과 같습니다. 최고급 데이터를 암호화 (적절히!)하거나 암호로 서명합니다. 적어도, 사람들은 SWF 파일에서 비밀 키를 추출해야하기 때문에 최고 점수 시스템을 해독하기가 더 어려워집니다. 많은 사람들이 아마 거기서 포기할 것입니다. 반면에, 필요한 것은 키를 추출하여 어딘가에 게시하는 것입니다.

    최고 점수 시스템이 Flash 응용 프로그램이 네트워크를 통해 암호화되지 않은 / 서명되지 않은 최고 점수 데이터를 전송한다는 사실을 기반으로 할 때마다 차단 및 조작 / 재생할 수 있습니다. 해답은 다음과 같습니다. 최고급 데이터를 암호화 (적절히!)하거나 암호로 서명합니다. 적어도, 사람들은 SWF 파일에서 비밀 키를 추출해야하기 때문에 최고 점수 시스템을 해독하기가 더 어려워집니다. 많은 사람들이 아마 거기서 포기할 것입니다. 반면에, 필요한 것은 키를 추출하여 어딘가에 게시하는 것입니다.

    실제 솔루션은 Flash 응용 프로그램과 최고 점수 데이터베이스 간의 더 많은 통신을 포함하므로 후자는 주어진 점수가 다소 현실적인지 확인할 수 있습니다. 이것은 아마도 당신이 가지고있는 게임의 종류에 따라 복잡 할 것입니다.

  11. ==============================

    11.SWF를 디 컴파일하는 것이 쉬우므로 해킹을 완전히 해할 수있는 방법이 없습니다. 그러면 숙련 된 개발자 해커가 코드를 추적하고 사용할 수있는 암호화 된 시스템을 우회하는 방법을 알아낼 수 있습니다.

    SWF를 디 컴파일하는 것이 쉬우므로 해킹을 완전히 해할 수있는 방법이 없습니다. 그러면 숙련 된 개발자 해커가 코드를 추적하고 사용할 수있는 암호화 된 시스템을 우회하는 방법을 알아낼 수 있습니다.

    TamperData와 같은 간단한 도구를 사용하여 아이들의 부정 행위를 막으려 고하면 시작시 SWF에 전달하는 암호화 키를 생성 할 수 있습니다. 그런 다음 http://code.google.com/p/as3crypto/와 같은 것을 사용하여 높은 점수를 암호화 한 다음 PHP 코드로 다시 전달하십시오. 그런 다음 데이터베이스에 저장하기 전에 서버 끝에서 해독하십시오.

  12. ==============================

    12.당신은 "고객 신뢰"문제에 대해 이야기하고 있습니다. 클라이언트 (이 현금, 브라우저에서 실행되는 SWF)가 수행하려고하는 작업을 수행하고 있기 때문입니다. 높은 점수를 저장하십시오.

    당신은 "고객 신뢰"문제에 대해 이야기하고 있습니다. 클라이언트 (이 현금, 브라우저에서 실행되는 SWF)가 수행하려고하는 작업을 수행하고 있기 때문입니다. 높은 점수를 저장하십시오.

    문제는 "점수 저장"요청이 임의의 HTTP 요청이 아닌 플래시 무비에서 오는 것인지 확인하고자하는 것입니다. 이에 대한 가능한 해결책은 높은 점수를 저장하라는 요청에 동행해야하는 요청 (flasm 사용)시 서버에 생성 된 토큰을 SWF로 인코딩하는 것입니다. 서버가 점수를 저장하면 토큰이 만료되어 더 이상 요청에 사용할 수 없습니다.

    이 단점은 사용자가 플래시 무비의로드 당 하나의 높은 점수 만 제출할 수 있다는 것입니다. 새 스코어로 다시 재생하기 전에 SWF를 새로 고치거나 다시로드해야합니다.

  13. ==============================

    13.나는 보통 최고 기록 항목과 함께 게임 세션의 "고스트 데이터"를 포함합니다. 그래서 레이싱 게임을 만들면 리플레이 데이터가 포함됩니다. 재생 기능이나 고스트 레이싱 기능을위한 재생 데이터가있는 경우가 많습니다 (마지막 레이스와의 경기 또는 리더 보드의 14 번 유령에 대항하여 플레이하는 경우).

    나는 보통 최고 기록 항목과 함께 게임 세션의 "고스트 데이터"를 포함합니다. 그래서 레이싱 게임을 만들면 리플레이 데이터가 포함됩니다. 재생 기능이나 고스트 레이싱 기능을위한 재생 데이터가있는 경우가 많습니다 (마지막 레이스와의 경기 또는 리더 보드의 14 번 유령에 대항하여 플레이하는 경우).

    이것들을 검사하는 것은 매우 수작업이지만, 컨테스트의 상위 10 개 항목이 합법적인지 여부를 확인하는 것이 목표라면 다른 사람이 이미 지적한 보안 조치의 유용한 수단이 될 수 있습니다.

    목표는 아무도 그들을 보지 않고도 시간이 끝날 때까지 온라인 상에 높은 점수를 유지하는 것이지 만, 많은 것을 얻지는 못합니다.

  14. ==============================

    14.새로운 대중적인 아케이드 모드가하는 방식은 플래시에서 PHP로 데이터를 보내고 플래시로 다시 보내거나 다시로드 한 다음 PHP로 돌아 오는 것입니다. 이렇게하면 데이터를 비교하려는 모든 작업을 수행 할 수 있으며 게시 데이터 / 해독 해킹 등을 우회 할 수 있습니다. 이 작업을 수행하는 한 가지 방법은 php에서 2 개의 무작위 값을 플래시에 할당하는 것입니다 (실시간 플래시 데이터 그래버를 실행하더라도 잡거나 볼 수 없음). 수학 공식을 사용하여 임의의 값으로 점수를 추가 한 다음이를 사용하여 검사합니다. 마지막으로 PHP로 이동했을 때 점수가 일치하는지 확인하기 위해 동일한 수식을 사용합니다. 이 무작위 값은 결코 볼 수 없으며 트랜잭션이 발생하는 시간도 표시됩니다. 몇 초가 지나면 무작위로 계산 된 값을 알아 내려고 보내기를 중지했다고 가정하므로 부정 행위로 표시됩니다. 점수 값과 비교할 수있는 임의의 값을 반환하는 암호 유형을 통한 숫자입니다.

    새로운 대중적인 아케이드 모드가하는 방식은 플래시에서 PHP로 데이터를 보내고 플래시로 다시 보내거나 다시로드 한 다음 PHP로 돌아 오는 것입니다. 이렇게하면 데이터를 비교하려는 모든 작업을 수행 할 수 있으며 게시 데이터 / 해독 해킹 등을 우회 할 수 있습니다. 이 작업을 수행하는 한 가지 방법은 php에서 2 개의 무작위 값을 플래시에 할당하는 것입니다 (실시간 플래시 데이터 그래버를 실행하더라도 잡거나 볼 수 없음). 수학 공식을 사용하여 임의의 값으로 점수를 추가 한 다음이를 사용하여 검사합니다. 마지막으로 PHP로 이동했을 때 점수가 일치하는지 확인하기 위해 동일한 수식을 사용합니다. 이 무작위 값은 결코 볼 수 없으며 트랜잭션이 발생하는 시간도 표시됩니다. 몇 초가 지나면 무작위로 계산 된 값을 알아 내려고 보내기를 중지했다고 가정하므로 부정 행위로 표시됩니다. 점수 값과 비교할 수있는 임의의 값을 반환하는 암호 유형을 통한 숫자입니다.

    당신이 나에게 묻는다면 이것은 꽤 좋은 해결책 인 것 같은데, 아무도이 방법을 사용하는 데 어떤 문제가 보이지 않습니까? 아니면 주위에 가능한 방법?

  15. ==============================

    15.가장 간단한 방법은 RegisterScore (score)와 같은 함수를 호출 할 때마다 점수를 등록한 다음 추가하고 점수를 인코딩하고 포장 한 다음 PHP 스크립트에 문자열로 전송할 때마다 호출하는 것입니다. PHP 스크립트는 올바르게 디코딩하는 방법을 알고 있습니다. 이렇게하면 점수를 강제로 시도 할 때 압축 해제 오류가 발생하므로 PHP 스크립트에 대한 모든 호출이 중지됩니다.

    가장 간단한 방법은 RegisterScore (score)와 같은 함수를 호출 할 때마다 점수를 등록한 다음 추가하고 점수를 인코딩하고 포장 한 다음 PHP 스크립트에 문자열로 전송할 때마다 호출하는 것입니다. PHP 스크립트는 올바르게 디코딩하는 방법을 알고 있습니다. 이렇게하면 점수를 강제로 시도 할 때 압축 해제 오류가 발생하므로 PHP 스크립트에 대한 모든 호출이 중지됩니다.

  16. ==============================

    16.사용자에 대한 지식없이 내부적으로 점수를 저장하는 서버 측의 모든 게임 논리를 유지하는 것만 가능합니다. 경제적이고 과학적인 이유로 인류는 턴 기반을 제외한 모든 게임 유형에이 이론을 적용 할 수 없습니다. 예 : 서버 측에서 물리학을 유지하는 것은 계산 비용이 많이 들고 손의 속도처럼 반응하기 어렵습니다. 가능한 한, 체스를하는 동안 누구나 AI 체스 게임 플레이를 상대방과 비교할 수 있습니다. 따라서 더 나은 멀티 플레이어 게임에는 주문형 창의력도 포함되어야합니다.

    사용자에 대한 지식없이 내부적으로 점수를 저장하는 서버 측의 모든 게임 논리를 유지하는 것만 가능합니다. 경제적이고 과학적인 이유로 인류는 턴 기반을 제외한 모든 게임 유형에이 이론을 적용 할 수 없습니다. 예 : 서버 측에서 물리학을 유지하는 것은 계산 비용이 많이 들고 손의 속도처럼 반응하기 어렵습니다. 가능한 한, 체스를하는 동안 누구나 AI 체스 게임 플레이를 상대방과 비교할 수 있습니다. 따라서 더 나은 멀티 플레이어 게임에는 주문형 창의력도 포함되어야합니다.

  17. ==============================

    17.당신이 원하는 것을 성취 할 수는 없습니다. CheatEngine과 같은 것을 사용하는 방법을 알고있을 때, 특히 웹 사이트 및 브라우저 서버 통신의 안전성에 관계없이, 여전히 극복하기가 비교적 쉽다는 것을 알 때, 플래시 앱의 내부는 항상 부분적으로 액세스 할 수 있습니다.

    당신이 원하는 것을 성취 할 수는 없습니다. CheatEngine과 같은 것을 사용하는 방법을 알고있을 때, 특히 웹 사이트 및 브라우저 서버 통신의 안전성에 관계없이, 여전히 극복하기가 비교적 쉽다는 것을 알 때, 플래시 앱의 내부는 항상 부분적으로 액세스 할 수 있습니다.

  18. ==============================

    18.AMFPHP를 통해 백엔드와 통신하는 것이 좋습니다. 적어도 게으른 사람들은 브라우저 콘솔을 통해 결과를 푸시하지 못하게해야합니다.

    AMFPHP를 통해 백엔드와 통신하는 것이 좋습니다. 적어도 게으른 사람들은 브라우저 콘솔을 통해 결과를 푸시하지 못하게해야합니다.

  19. from https://stackoverflow.com/questions/73947/what-is-the-best-way-to-stop-people-hacking-the-php-based-highscore-table-of-a-f by cc-by-sa and MIT license