फ़्लैश-गेम के PHP- आधारित हाईस्कोर टेबल को हैक करने वाले लोगों को रोकने का सबसे अच्छा तरीका क्या है


212

मैं एक एक्शन गेम के बारे में बात कर रहा हूं जिसमें कोई ऊपरी स्कोर सीमा नहीं है और चाल आदि को दोहराकर सर्वर पर स्कोर को सत्यापित करने का कोई तरीका नहीं है।

मुझे वास्तव में फ्लैश / पीएचपी में सबसे मजबूत एन्क्रिप्शन की आवश्यकता है, और लोगों को मेरी फ्लैश फाइल के अलावा PHP पेज को कॉल करने से रोकने का एक तरीका है। मैंने एक एकल स्कोर के लिए कई कॉल करने और एक चेकसम / रिट्रेसमेंट अनुक्रम आदि को पूरा करने के अतीत में कुछ सरल तरीकों की कोशिश की है, और Amayeta SWF एनक्रिप्ट के साथ SWF को भी बाधित कर रहा है, लेकिन वे सभी अंततः हैक कर लिए गए थे।

StackOverflow प्रतिक्रियाओं के लिए धन्यवाद, मुझे अब Adobe से कुछ और जानकारी मिली है - http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html और https://github.com/mikechambers-as3corelib - जो मुझे लगता है कि एन्क्रिप्शन के लिए उपयोग कर सकते हैं। हालांकि यह मुझे धोखा ChineEngine के आसपास मिलेगा यकीन नहीं है।

मुझे एएस 2 और एएस 3 दोनों के लिए सबसे अच्छा समाधान जानना होगा, अगर वे अलग हैं।

मुख्य समस्याएं टेम्परडाटा और लाइवहॉट हेडर जैसी चीजें प्रतीत होती हैं, लेकिन मैं समझता हूं कि अधिक उन्नत हैकिंग टूल भी हैं - जैसे चीटजाइन (धन्यवाद मार्क वेबस्टर)


आपको स्कोर सीमाएं डालनी चाहिए, कोई कारण नहीं है कि आप इसे नहीं कर सकते, प्रति स्तर, कुल में, ect ...
mpm

पहला लिंक किसी भी अधिक उपलब्ध नहीं है
माइक

जवाबों:


415

यह इंटरनेट गेम और प्रतियोगिता के साथ एक क्लासिक समस्या है। आपका फ़्लैश कोड उपयोगकर्ताओं के साथ गेम के लिए स्कोर तय करने के लिए काम करता है। लेकिन उपयोगकर्ता भरोसेमंद नहीं हैं, और फ़्लैश कोड उपयोगकर्ता के कंप्यूटर पर चलता है। आप SOL हैं। एक हमलावर को उच्च स्कोर बनाने से रोकने के लिए आप कुछ भी नहीं कर सकते हैं:

  • फ़्लैश इंजन को उल्टा करने के लिए आसान है जितना आप सोच सकते हैं कि यह है, क्योंकि बाइटकोड अच्छी तरह से प्रलेखित हैं और एक उच्च-स्तरीय भाषा (Actionscript) का वर्णन करते हैं --- जब आप एक फ्लैश गेम प्रकाशित करते हैं, तो आप अपना स्रोत कोड प्रकाशित कर रहे हैं, चाहे आप पता है या नहीं।

  • हमलावर फ्लैश दुभाषिया की रनटाइम मेमोरी को नियंत्रित करते हैं, ताकि जो कोई भी प्रोग्रामेबल डिबगर का उपयोग करना जानता है वह किसी भी समय (वर्तमान स्कोर सहित) किसी भी चर को बदल सकता है या प्रोग्राम को ही बदल सकता है।

आपके सिस्टम के खिलाफ सबसे सरल संभावित हमला है प्रॉक्सी के माध्यम से गेम के लिए HTTP ट्रैफिक चलाना, हाई-स्कोर सेव को पकड़ना और इसे उच्च स्कोर के साथ फिर से खेलना।

आप खेल के एकल उदाहरण के लिए प्रत्येक हाई स्कोर सेविंग को बाइंड करके इस हमले को रोकने का प्रयास कर सकते हैं, उदाहरण के लिए गेम स्टार्टअप पर क्लाइंट को एक एन्क्रिप्टेड टोकन भेजकर, जो इस तरह दिख सकता है:

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

(आप एक ही प्रभाव के लिए एक सत्र कुकी का उपयोग भी कर सकते हैं)।

गेम कोड इस टोकन को उच्च-स्कोर सेव के साथ सर्वर पर वापस भेज देता है। लेकिन एक हमलावर अभी भी खेल को फिर से लॉन्च कर सकता है, एक टोकन प्राप्त कर सकता है, और फिर उस टोकन को तुरंत एक पुनरावृत्त उच्च स्कोर बचाने के लिए पेस्ट कर सकता है।

तो आगे आप न केवल एक टोकन या सत्र कुकी खिलाते हैं, बल्कि एक उच्च स्कोर-एन्क्रिप्टिंग सत्र कुंजी भी। यह एक 128 बिट एईएस कुंजी होगी, जो फ़्लैश गेम में एक हार्ड हार्डकोड के साथ एन्क्रिप्टेड है:

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 से मेल खाता है (यदि आप इस चरण को छोड़ देते हैं , डिक्रिप्शन बस यादृच्छिक उत्पादन करेगा, संभावना बहुत उच्च, उच्च स्कोर)।

तो अब हमलावर आपके फ़्लैश कोड को हटा देता है और जल्दी से एईएस कोड पाता है, जो एक गले में अंगूठे की तरह चुभता है, हालांकि अगर यह 15 मिनट में एक मेमोरी सर्च और एक ट्रेसर के साथ नीचे नहीं जाता है (तो मुझे पता है) इस खेल के लिए मेरा स्कोर 666 है, तो आइए 666 मेमोरी में खोजें, फिर उस मान को छूने वाले किसी भी ऑपरेशन को पकड़ लें --- ओह, हाई स्कोर एन्क्रिप्शन कोड! ")। सत्र कुंजी के साथ, हमलावर को फ्लैश कोड भी नहीं चलाना है; वह एक गेम लॉन्च टोकन और एक सत्र कुंजी लेता है और एक मनमाना उच्च स्कोर वापस भेज सकता है।

अब आप उस बिंदु पर हैं जहाँ अधिकांश डेवलपर्स सिर्फ देते हैं --- हमलावरों के साथ खिलवाड़ करने के लिए कुछ महीने देते हैं:

  • एक्सईआर संचालन के साथ एईएस कुंजियों को रगड़ना

  • प्रमुख बाइट सरणियों को उन फ़ंक्शन के साथ बदलना जो कुंजी की गणना करते हैं

  • बाइनरी भर में नकली कुंजी एन्क्रिप्ट और उच्च स्कोर पोस्टिंग बिखेरना।

यह सब ज्यादातर समय की बर्बादी है। यह बिना कहे चला जाता है, एसएसएल आपकी मदद करने वाला नहीं है; SSL दो SSL समापन बिंदु में से एक के खराब होने पर आपकी सुरक्षा नहीं कर सकता है।

यहाँ कुछ चीजें हैं जो वास्तव में उच्च स्कोर धोखाधड़ी को कम कर सकती हैं:

  • खेल खेलने के लिए एक लॉगिन की आवश्यकता होती है, लॉगिन में एक सत्र कुकी का उत्पादन होता है, और एक ही उपयोगकर्ता के लिए एक ही सत्र, या एक ही उपयोगकर्ता के लिए कई समवर्ती सत्रों में कई उत्कृष्ट गेम लॉन्च करने की अनुमति नहीं होती है।

  • खेल सत्रों से उच्च स्कोर को अस्वीकार करें, जो कि अब तक खेले गए सबसे कम वास्तविक खेलों से कम है (अधिक परिष्कृत दृष्टिकोण के लिए, खेल सत्रों के लिए "उच्च स्कोर" की कोशिश करें जो कि औसत खेल अवधि के नीचे 2 मानक विचलन से कम है)। सुनिश्चित करें कि आप गेम ड्यूरेशन सर्वराइड को ट्रैक कर रहे हैं।

  • केवल एक या दो बार खेल खेलने वाले लोगों के उच्च स्कोर को अस्वीकार या संगरोध करें, ताकि हमलावरों को उनके द्वारा बनाए गए प्रत्येक लॉगिन के लिए उचित दिखने वाले खेल खेलने का "पेपर ट्रेल" तैयार करना पड़े।

  • गेम खेलने के दौरान "हार्टबीट" स्कोर, ताकि आपका सर्वर एक गेम खेलने के जीवनकाल में स्कोर की वृद्धि को देखे। उच्च स्कोर को अस्वीकार करें जो उचित स्कोर घटता का पालन न करें (उदाहरण के लिए, 0 से 999999 तक कूद)।

  • गेम खेलने के दौरान "स्नैपशॉट" गेम स्थिति (उदाहरण के लिए, गोला-बारूद की मात्रा, स्तर में स्थिति, आदि), जिसे आप बाद में रिकॉर्ड किए गए अंतरिम स्कोर के साथ सामंजस्य स्थापित कर सकते हैं। आपके पास प्रारंभ करने के लिए इस डेटा में विसंगतियों का पता लगाने का एक तरीका भी नहीं है; आपको बस इसे इकट्ठा करना है, और फिर आप वापस जा सकते हैं और इसका विश्लेषण कर सकते हैं यदि चीजें गड़बड़ दिखती हैं।

  • किसी भी उपयोगकर्ता के खाते को अक्षम करें, जो आपकी सुरक्षा जांच में से किसी एक को विफल करता है (उदाहरण के लिए, कभी भी एन्क्रिप्ट किए गए उच्च स्कोर को प्रस्तुत करने से जो सत्यापन विफल हो जाता है)।

याद रखें कि आप केवल उच्च स्कोर धोखाधड़ी को रोक रहे हैं। नहीं है कुछ भी नहीं है आप अगर रोकने के लिए क्या कर सकते हैं। यदि आपके गेम में लाइन पर पैसा है, तो कोई भी आपके साथ आने वाले किसी भी सिस्टम को हराने वाला है। उद्देश्य इस हमले को रोकना नहीं है ; यह हमले को खेल में वास्तव में अच्छा होने और इसे हरा देने की तुलना में अधिक महंगा है।


23
मैंने एक ऑनलाइन गेम समुदाय बनाया, और हमने अपने पूरे इनाम प्रणाली को केवल सर्वोच्च स्कोरर के बजाय शीर्ष 10 वें प्रतिशत के स्कोर को पुरस्कृत करने के लिए डिज़ाइन किया और इसने बहुत अच्छा काम किया है, इसलिए समस्या को हल करने की कोशिश करना भी मदद करता है!
अंगूर

1
अच्छा! संक्षेप में, जब तक खेल सर्वर पर नहीं चलता (या कम से कम सर्वर पर चलने वाला एक पवित्रता जाँच), आप दुरुपयोग को रोक नहीं सकते। मल्टीप्लेयर निशानेबाजों के साथ एक ही समस्या: यदि ग्राहक को बेहतर लक्ष्य बनाने के लिए संशोधित किया गया है, तो आप नेटवर्क प्रोटोकॉल में इसे रोक नहीं सकते हैं।
केरेक एसबी

3
मुझे लगता है कि कोई भी सभी उपयोगकर्ता कार्यों को लॉग इन कर सकता है और उच्च स्कोर को सत्यापित / निर्धारित करने के लिए सर्वर पर फिर से खेलना कर सकता है
I3ck

25

आप गलत सवाल पूछ रहे होंगे। आपको लगता है कि लोग उन तरीकों पर ध्यान केंद्रित कर रहे हैं जो उच्च स्कोर सूची में अपना रास्ता बनाने के लिए उपयोग कर रहे हैं, लेकिन विशिष्ट तरीकों को अवरुद्ध करना केवल अब तक जाता है। मुझे टेम्परडाटा का कोई अनुभव नहीं है, इसलिए मैं उससे बात नहीं कर सकता।

आपके द्वारा पूछे जाने वाला प्रश्न यह है: "मैं कैसे सत्यापित कर सकता हूं कि प्रस्तुत स्कोर वैध और प्रामाणिक हैं?" ऐसा करने का विशिष्ट तरीका खेल-निर्भर है। बहुत ही सरल पहेली खेलों के लिए, आप विशिष्ट प्रारंभिक अवस्था और चालों के अनुक्रम के साथ स्कोर पर भेज सकते हैं, जिसके परिणामस्वरूप अंतिम स्थिति होती है, और फिर उसी चाल का उपयोग करके सर्वर पर गेम को फिर से चलाते हैं। इस बात की पुष्टि करें कि उल्लिखित स्कोर गणना किए गए स्कोर के समान है और यदि वे मैच करते हैं तो केवल स्कोर स्वीकार करते हैं।


2
यह एक तकनीक है जिसका उपयोग मैंने अतीत में और साथ ही एक मतदान प्रणाली के लिए किया है। ऐसा कोई तरीका नहीं है जिससे आप लोगों को धोखा देने से रोक सकें, जो आप कर सकते हैं लेकिन उनके व्यवहार को रिकॉर्ड करें ताकि आप जांच सकें कि क्या धोखा है। हमारे मतदान प्रणाली के लिए हम समय टिकटों और आईपी पते को संग्रहीत करते थे। [cont।]
ल्यूक

1
इस तरह हम कम से कम धोखा व्यवहार के पैटर्न को देख सकते हैं और जब आवश्यक हो तो लोगों को अयोग्य घोषित कर सकते हैं। हमने इसे कई बार सफलतापूर्वक उपयोग किया है।
ल्यूक

19

ऐसा करने का एक आसान तरीका यह होगा कि आपके हाईस्कोर वैल्यू के क्रिप्टोग्राफ़िक हैश के साथ-साथ यह स्वयं स्कोर भी प्रदान करे। उदाहरण के लिए, HTTP GET के माध्यम से परिणाम पोस्ट करते समय: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

इस चेकसम की गणना करते समय, एक साझा रहस्य का उपयोग किया जाना चाहिए; इस रहस्य को कभी भी नेटवर्क पर प्रसारित नहीं किया जाना चाहिए, लेकिन PHP बैकएंड और फ्लैश फ्रंटेंड दोनों के भीतर हार्ड कोडित होना चाहिए। ऊपर दिए गए चेकसम को "" गुप्त "" स्कोर " 500 " के साथ जोड़कर, और इसे md5sum के माध्यम से चलाकर बनाया गया था ।

हालांकि यह प्रणाली एक उपयोगकर्ता को मनमाने ढंग से स्कोर पोस्ट करने से रोकेगी, लेकिन यह "रीप्ले अटैक" को नहीं रोकता है, जहां उपयोगकर्ता पहले से गणना किए गए स्कोर और हैश के संयोजन को रीपोस्ट करता है। ऊपर के उदाहरण में, 500 का स्कोर हमेशा एक ही हैश स्ट्रिंग का उत्पादन करेगा। इस जोखिम में से कुछ को अधिक जानकारी (जैसे कि एक उपयोगकर्ता नाम, टाइमस्टैम्प, या आईपी पते) को शामिल करके कम किया जा सकता है जो कि हैशेड होना है। हालांकि यह डेटा के पुनरावृत्ति को नहीं रोकेगा, यह बीमा करेगा कि डेटा का एक सेट केवल एक ही समय में एक उपयोगकर्ता के लिए मान्य है।

किसी भी रिप्ले हमलों को होने से रोकने के लिए , कुछ प्रकार की चुनौती-प्रतिक्रिया प्रणाली बनाई जाएगी, जैसे कि निम्नलिखित:

  1. फ़्लैश गेम ("क्लाइंट") कोई पैरामीटर के साथ http://example.com/highscores.php का HTTP GET करता है । यह पृष्ठ दो मान लौटाता है: एक बेतरतीब ढंग से उत्पन्न नमक मूल्य, और उस गुप्त मूल्य का एक क्रिप्टोग्राफ़िक हैश साझा रहस्य के साथ। यह नमक मूल्य लंबित प्रश्नों के एक स्थानीय डेटाबेस में संग्रहीत किया जाना चाहिए, और इसके साथ एक टाइमस्टैम्प जुड़ा होना चाहिए ताकि यह शायद एक मिनट के बाद "समाप्त" हो सके।
  2. फ़्लैश गेम साझा किए गए रहस्य के साथ नमक मूल्य को जोड़ता है और यह सत्यापित करने के लिए एक हैश की गणना करता है कि यह सर्वर द्वारा प्रदान किए गए एक से मेल खाता है। यह कदम उपयोगकर्ताओं द्वारा नमक मूल्यों के साथ छेड़छाड़ को रोकने के लिए आवश्यक है, क्योंकि यह पुष्टि करता है कि सर्वर द्वारा वास्तव में नमक मूल्य उत्पन्न किया गया था।
  3. फ़्लैश गेम साझा किए गए रहस्य, उच्च स्कोर मूल्य और किसी भी अन्य प्रासंगिक जानकारी (उपनाम, आईपी, टाइमस्टैम्प) के साथ नमक मूल्य को जोड़ती है, और एक हैश की गणना करता है। इसके बाद यह जानकारी HTTP GET या POST के माध्यम से PHP बैकेंड को नमक मूल्य, उच्च स्कोर और अन्य जानकारी के साथ वापस भेजती है।
  4. सर्वर क्लाइंट पर उसी तरह से प्राप्त जानकारी को जोड़ती है, और यह सत्यापित करने के लिए एक हैश की गणना करता है कि यह क्लाइंट द्वारा प्रदान की गई वस्तु से मेल खाता है। यह तब भी पुष्टि करता है कि लंबित क्वेरी सूची में सूचीबद्ध नमक मान अभी भी मान्य है। यदि ये दोनों स्थितियां सत्य हैं, तो यह उच्च अंक तालिका में उच्च अंक लिखता है और क्लाइंट को एक हस्ताक्षरित "सफलता" संदेश देता है। यह लंबित क्वेरी सूची से नमक मान भी निकालता है।

कृपया ध्यान रखें कि उपरोक्त तकनीकों में से किसी की सुरक्षा से समझौता किया जाता है यदि साझा रहस्य कभी भी उपयोगकर्ता के लिए सुलभ हो

एक विकल्प के रूप में, इस कुछ आगे-पीछे क्लाइंट को HTTPS पर सर्वर के साथ संचार करने के लिए मजबूर करने से बचा जा सकता है, और यह सुनिश्चित करते हुए कि ग्राहक केवल एक विशिष्ट प्रमाणपत्र प्राधिकारी द्वारा हस्ताक्षरित प्रमाणपत्रों पर भरोसा करने के लिए पूर्वनिर्धारित है, जिसे आप अकेले एक्सेस करते हैं। ।


11

मुझे पसंद है कि tpqf ने क्या कहा, लेकिन धोखा मिलने पर खाता निष्क्रिय करने के बजाय, एक हनीपॉट लागू करें ताकि जब भी वे लॉग इन करें, वे अपने हैक किए गए स्कोर को देखें और कभी भी संदेह न करें कि उन्हें ट्रोल के रूप में चिह्नित किया गया है। "PhpBB MOD ट्रोल" के लिए Google और आपको एक सरल दृष्टिकोण दिखाई देगा।


1
उस दृष्टिकोण के साथ समस्या यह है कि ये संदेश बोर्ड आदि पर एक-दूसरे को धोखा देते हैं, इसलिए यह वास्तव में उन्हें परेशान नहीं करेगा।
इयना

7
मैं असहमत हूं। यह बहुत ही चतुर दृष्टिकोण की तरह लगता है।
bzlm

4

स्वीकृत उत्तर में tqbf का उल्लेख है कि आप केवल स्कोर चर के लिए एक मेमोरी खोज कर सकते हैं ("मेरा स्कोर 666 है इसलिए मैं स्मृति में संख्या 666 की तलाश करता हूं")।

इसके चारों ओर एक रास्ता है। मेरे पास यहां एक वर्ग है: http://divillysausages.com/blog/safenumber_and_safeint

मूल रूप से, आपके पास अपने स्कोर को स्टोर करने के लिए एक ऑब्जेक्ट है। सेटर में यह उस मान को गुणा करता है जिसे आप इसे यादृच्छिक संख्या (+ और -) के साथ पास करते हैं, और गेट्टर में आप सहेजे गए मान को यादृच्छिक गुणक द्वारा विभाजित करते हैं ताकि मूल वापस मिल सके। यह सरल है, लेकिन स्मृति खोज को रोकने में मदद करता है।

इसके अलावा, PushButton इंजन के पीछे के कुछ लोगों के वीडियो देखें जो हैकिंग का सामना करने के कुछ अलग तरीकों के बारे में बात करते हैं: http://zaa.tv/2010/12/the-art-of-hacking-flash- खेल / । वे वर्ग के पीछे प्रेरणा थे।


4

मैंने तरह तरह के वर्कअराउंड किए ... मैंने एक दिया था जहां स्कोर बढ़ा (आपको हमेशा +1 स्कोर मिलता है)। सबसे पहले, मैंने यादृच्छिक संख्या से गिनना शुरू किया (चलो 14 कहते हैं) और जब मैं स्कोर प्रदर्शित करता हूं, तो बस स्कोर माइनस 14. दिखाया गया था। ऐसा इसलिए था यदि पटाखे 20 के लिए उदाहरण की तलाश में हैं, तो वे इसे नहीं पाएंगे (यह स्मृति में 34 होगी)। दूसरा, चूंकि मुझे पता है कि अगला बिंदु क्या होना चाहिए ... मैंने एडोब क्रिप्टो लाइब्रेरी का इस्तेमाल किया, ताकि अगला बिंदु क्या होगा। जब मुझे अंकों को बढ़ाना होता है, तो मैं जांचता हूं कि क्या वृद्धि अंकों का हैश बराबर हैश होना चाहिए। यदि पटाखा ने मेमोरी में अंक बदल दिए हैं, तो हैश बराबर नहीं है। मैं कुछ सर्वर-साइड सत्यापन करता हूं और जब मुझे गेम से और पीएचपी से अलग-अलग अंक मिले, तो मुझे पता है कि धोखा शामिल था। यहाँ स्निपेट ओट माय कोड है (मैं एडोब क्रिप्टो लाइब्रेटी एमडी 5 क्लास और रैंडम क्रिप्टोग्राफी नमक का उपयोग कर रहा हूं। कॉल पीपीएचपी () मेरा सर्वर साइड सत्यापन है)

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 अवरोधन, मैं पटाखे रोकने में सक्षम था। इसके अलावा, जब मैं सर्वर-साइड पर स्कोर भेज रहा हूं, तो मैं अपने छोटे, एन्क्रिप्शन / डिक्रिप्शन फ़ंक्शन का उपयोग करता हूं। कुछ इस तरह (सर्वर साइड कोड शामिल नहीं है, लेकिन आप एल्गोरिथ्म देख सकते हैं और इसे 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
}

फिर मैं अन्य नकली-चर के साथ चर भेजता हूं और यह बस रास्ते के बीच खो जाता है ... यह सिर्फ छोटे फ़्लैश खेल के लिए बहुत काम है, लेकिन जहां पुरस्कार शामिल होते हैं कुछ लोग सिर्फ लालची हो जाते हैं। अगर आपको कोई मदद चाहिए, तो मुझे एक पीएम लिखिए।

चीयर्स, Ico


3

एक ज्ञात (निजी) प्रतिवर्ती कुंजी का उपयोग करके एन्क्रिप्ट करना सबसे सरल तरीका होगा। मैं सभी पर नहीं हूँ इसलिए मुझे यकीन नहीं है कि एन्क्रिप्शन प्रदाता किस प्रकार के हैं।

लेकिन आप गेम-लेंथ (एन्क्रिप्टेड, फिर से) और एक क्लिक गणना जैसे चर शामिल कर सकते हैं।

इस तरह की सभी चीजें रिवर्स इंजीनियर हो सकती हैं इसलिए लोगों को खुशबू से दूर करने के लिए जंक डेटा के एक समूह में फेंकने पर विचार करें।

संपादित करें: यह कुछ PHP सत्रों में भी चकिंग के लायक हो सकता है। सत्र शुरू करें जब वे खेल शुरू करते हैं और (इस पोस्ट के लिए टिप्पणी कहते हैं) समय लॉग करें। जब वे स्कोर जमा करते हैं तो आप जांच सकते हैं कि उन्हें वास्तव में एक खुला खेल मिला है और वे बहुत जल्द या बहुत बड़े स्कोर को जमा नहीं कर रहे हैं।

यह देखने के लिए कि क्या अधिकतम स्कोर प्रति सेकंड / मिनट का खेल है, यह देखने के लिए एक स्केलर पर काम करने लायक हो सकता है।

इनमें से कोई भी चीज़ अनियंत्रित नहीं है, लेकिन यह फ़्लैश में कुछ तर्क नहीं होने में मदद करेगा जहां लोग इसे देख सकते हैं।


इस दृष्टिकोण का पालन करने वाले को भी एक समय शामिल करना होगा, और समय को मान्य करना होगा, अन्यथा आप फिर से हमलों की चपेट में आ सकते हैं।
टॉम रिटर

3

मेरे अनुभव में, यह एक प्रोग्रामिंग समस्या के बजाय सामाजिक इंजीनियरिंग समस्या के रूप में सबसे अच्छा है। धोखा देने के लिए इसे असंभव बनाने पर ध्यान देने के बजाय, धोखा देने के लिए प्रोत्साहन को हटाकर इसे उबाऊ बनाने पर ध्यान केंद्रित करें। उदाहरण के लिए, यदि मुख्य प्रोत्साहन सार्वजनिक रूप से उच्च स्कोर दिखाई दे रहा है, तो बस जब उच्च स्कोर दिखाए जाते हैं, तो देरी करते हुए, थिएटरों के लिए सकारात्मक प्रतिक्रिया पाश को हटाकर धोखाधड़ी को काफी कम कर सकते हैं।


12
लेकिन यह वास्तविक खिलाड़ियों के लिए एक त्वरित उच्च स्कोर की सकारात्मक प्रतिक्रिया को भी हटा देता है, इसलिए आप खेल खेलने की गुणवत्ता को कम कर रहे हैं।
क्रिस गैरेट

3

आप किसी भी ग्राहक के रिटर्न पर भरोसा नहीं कर सकते। सर्वर साइड पर सत्यापन करने की आवश्यकता है। मैं गेम डेवलपर नहीं हूं, लेकिन मैं बिजनेस सॉफ्टवेयर बनाता हूं। दोनों उदाहरणों में पैसा शामिल हो सकता है और लोग क्लाइंट साइड ऑबफ्यूजन तकनीक को तोड़ देंगे।

शायद समय-समय पर सर्वर को डेटा भेजें और कुछ सत्यापन करें। क्लाइंट कोड पर ध्यान केंद्रित न करें, भले ही वह वह जगह हो जहां आपका ऐपेटाइटन रहता है।


2

जब भी आपका हाईस्कोर सिस्टम इस तथ्य पर आधारित होता है कि फ़्लैश एप्लिकेशन नेटवर्क के माध्यम से अनसेंसर्ड / अहस्ताक्षरित हाइस्कोर डेटा भेजता है, जिसे इंटरसेप्ट किया जा सकता है और हेरफेर किया जा सकता है। इसका उत्तर इस प्रकार है: एन्क्रिप्ट (शालीनता से!) या क्रिप्टोग्राफिक रूप से हाईस्कोर डेटा पर हस्ताक्षर करें। यह, कम से कम, लोगों को आपके हाईस्कोर सिस्टम को क्रैक करने के लिए कठिन बनाता है क्योंकि उन्हें आपकी एसडब्ल्यूएफ फ़ाइल से गुप्त कुंजी निकालने की आवश्यकता होगी। बहुत से लोग शायद वहीं छोड़ देंगे। दूसरी ओर, यह सब लगता है कि एक व्यक्ति को कुंजी निकालने और कहीं पोस्ट करने के लिए है।

वास्तविक समाधान में फ्लैश एप्लिकेशन और हाईस्कोर डेटाबेस के बीच अधिक संचार होता है ताकि बाद वाला यह सत्यापित कर सके कि एक दिया गया स्कोर कुछ हद तक यथार्थवादी है। यह संभवतः जटिल है कि आप किस तरह के खेल पर निर्भर हैं।


2

इसे पूरी तरह से अस्वीकार्य बनाने का कोई तरीका नहीं है, क्योंकि यह SWF को डिकम्पोज करना आसान है, और एक कुशल डेवलपर हैकर तब आपके कोड के माध्यम से ट्रेस कर सकता है और आपके द्वारा नियोजित किसी भी एन्क्रिप्ट किए गए सिस्टम को बायपास करने का काम कर सकता है।

यदि आप केवल टैम्परेडाटा जैसे सरल उपकरणों के उपयोग के माध्यम से बच्चों को धोखा देना बंद करना चाहते हैं, तो आप एक एन्क्रिप्शन कुंजी उत्पन्न कर सकते हैं जिसे आप स्टार्टअप में SWF में पास करते हैं। फिर PHP कोड पर वापस जाने से पहले उच्च स्कोर को एन्क्रिप्ट करने के लिए http://code.google.com/p/as3crypto/ जैसी किसी चीज़ का उपयोग करें । फिर इसे डेटाबेस में संग्रहीत करने से पहले सर्वर अंत में डिक्रिप्ट करें।


2

आप "क्लाइंट ट्रस्ट" समस्या के बारे में बात कर रहे हैं। क्योंकि क्लाइंट (इस नकदी में, एक ब्राउज़र में एक SWF चल रहा है) कुछ ऐसा कर रहा है जिसे वह करने के लिए डिज़ाइन किया गया है। एक उच्च स्कोर बचाओ।

समस्या यह है कि आप यह सुनिश्चित करना चाहते हैं कि "स्कोर सहेजें" अनुरोध आपकी फ़्लैश फिल्म से आ रहे हैं, न कि कुछ मनमाने ढंग से HTTP अनुरोध। इसके लिए एक संभावित समाधान अनुरोध के समय ( flasm का उपयोग करके ) SWF में सर्वर द्वारा उत्पन्न एक टोकन को एनकोड करना है जो एक उच्च स्कोर को बचाने के लिए अनुरोध के साथ होना चाहिए। एक बार सर्वर उस स्कोर को सहेज लेता है, टोकन समाप्त हो जाता है और अब अनुरोधों के लिए उपयोग नहीं किया जा सकता है।

इसका नकारात्मक पक्ष यह है कि एक उपयोगकर्ता केवल फ्लैश फिल्म के प्रति लोड के एक उच्च स्कोर को प्रस्तुत करने में सक्षम होगा - आपको उन्हें एसडब्ल्यूएफ को फिर से ताज़ा करने / पुनः लोड करने के लिए मजबूर करना होगा क्योंकि वे नए स्कोर के लिए फिर से खेल सकते हैं।


2

मैं आमतौर पर हाईस्कोर प्रविष्टि के साथ खेल सत्र का "भूत डेटा" शामिल करता हूं। इसलिए अगर मैं रेसिंग गेम बना रहा हूं, तो मैं रिप्ले डेटा शामिल करता हूं। आपके पास अक्सर रिप्ले कार्यक्षमता या भूत रेसिंग कार्यक्षमता के लिए पहले से ही रिप्ले डेटा है (अपनी आखिरी दौड़ के खिलाफ खेलना, या लीडरबोर्ड पर ड्यूड # 14 के भूत के खिलाफ खेलना)।

इनकी जाँच करना बहुत ही श्रम परिश्रम है, लेकिन अगर लक्ष्य को सत्यापित करना है कि क्या किसी प्रतियोगिता में शीर्ष 10 प्रविष्टियाँ वैध हैं, तो यह सुरक्षा उपायों के शस्त्रागार के लिए एक उपयोगी जोड़ हो सकता है, जो अन्य लोगों ने पहले ही बता दिया है।

यदि लक्ष्य हाईस्कोर्स सूची को ऑनलाइन रखना है, तो समय के अंत को बिना किसी की ओर देखे, इससे आपको ज्यादा फायदा नहीं होगा।


2

जिस तरह से एक नया लोकप्रिय आर्केड मॉड यह करता है वह यह है कि यह फ्लैश से पीएचपी, बैक टू फ्लैश (या इसे फिर से लोड करता है) से डेटा भेजता है, फिर पीएचपी पर वापस जाता है। यह आपको डेटा की तुलना करने के लिए कुछ भी करने की अनुमति देता है और साथ ही पोस्ट डेटा / डिक्रिप्शन हैक्स और पसंद को बायपास करता है। एक तरीका यह है कि यह php से 2 यादृच्छिक मानों को फ़्लैश में असाइन करके है (जिसे आप रियलटाइम फ्लैश डेटा ग्रैबर चलाने पर भी नहीं पकड़ सकते हैं या नहीं देख सकते हैं), गणितीय फॉर्मूले का उपयोग करके यादृच्छिक मानों के साथ स्कोर जोड़ने के लिए इसका उपयोग करके जाँच करें। यह देखने के लिए कि क्या स्कोर अंत में php पर जाता है, यह देखने के लिए इसे रिवर्स करने के लिए एक ही फॉर्मूला है। ये यादृच्छिक मूल्य कभी भी दिखाई नहीं देते हैं और साथ ही यह लेन-देन का समय भी होता है और यदि यह होता है '

यह एक बहुत अच्छा समाधान की तरह लगता है यदि आप मुझसे पूछते हैं, तो क्या किसी को इस पद्धति का उपयोग करने के साथ कोई समस्या दिखाई देती है? या इसके आसपास संभव तरीके?


वायरशार्क। विर्सार्क हमेशा छेद होता है।
ऐहिलर्स

हाँ, ive ने इस सटीक तरीके की कोशिश की ... अच्छी तरह से ... मुझे किसी भी तरह वैध उपयोगकर्ताओं को थिएटर के रूप में लॉग किया जा रहा है (फ़ंक्शन मेरे कंप्यूटर पर हर समय काम करता है, लेकिन यह कुछ अन्य कंप्यूटरों पर काम नहीं करता है) ... तो अब मैं बस धोखा देने की अनुमति ... मैं उन लोगों को लॉग करता हूं जो उपरोक्त चेक पास नहीं करते हैं और मैं लोगों को वास्तव में उच्च स्कोर के साथ लॉग करता हूं और फिर मैन्युअल रूप से उनका दुरुपयोग करता हूं ... अपने स्कोर को बनाकर * -1: पी वे आमतौर पर मजाक को अच्छी तरह से लेते हैं।
सिगट्रान

1
"इसका एक तरीका यह है कि यह php से 2 रैंडमाइज्ड वैल्यूज़ को फ़्लैश में असाइन करके है (जिसे आप रियल टाइम फ्लैश डेटा ग्रैबर चलाने पर भी नहीं पकड़ सकते हैं या नहीं देख सकते हैं" - कृपया मुझे बताएं, क्या php से वैल्यू पास करने का कोई तरीका है फायरबग या किसी अन्य उपकरण द्वारा निगरानी किए बिना फ़्लैश?
mkto

2

मुझे लगता है कि सरलतम तरीका यह होगा कि रजिस्टरस्ककोर (स्कोर) जैसे फ़ंक्शन को कॉल करने के लिए हर बार जब गेम स्कोर जोड़ने के लिए रजिस्टर करता है और फिर उसे एनकोड करता है, पैकेज करता है और इसे स्ट्रिंग के रूप में php स्क्रिप्ट पर भेजता है। Php स्क्रिप्ट को पता होगा कि इसे कैसे ठीक से डिकोड करना है। यह किसी भी कॉल को सीधे php स्क्रिप्ट पर रोक देगा क्योंकि किसी भी स्कोर को मजबूर करने की कोशिश करने पर एक डिकंप्रेसन त्रुटि होगी।


2

यह केवल सर्वर-साइड पर सभी गेम लॉजिक को ध्यान में रखते हुए संभव है जो उपयोगकर्ता के ज्ञान के बिना आंतरिक रूप से स्कोर को संग्रहीत करता है। आर्थिक और वैज्ञानिक कारणों से, मानव जाति इस गेम को टर्न-आधारित को छोड़कर सभी गेम प्रकारों पर लागू नहीं कर सकती है। उदाहरण के लिए, सर्वर-साइड पर भौतिकी रखना हाथ की गति के रूप में उत्तरदायी होने के लिए कम्प्यूटेशनल रूप से महंगा और कठिन है। यहां तक ​​कि संभव है, शतरंज खेलते समय कोई भी एआई शतरंज गेमप्ले को प्रतिद्वंद्वी से मिला सके। इसलिए, बेहतर मल्टीप्लेयर गेम में ऑन-डिमांड रचनात्मकता भी होनी चाहिए।


1

यह वास्तव में संभव नहीं है कि आप क्या चाहते हैं। फ्लैश ऐप के इंटर्नल हमेशा आंशिक रूप से सुलभ होते हैं, खासकर जब आप जानते हैं कि चीटएंगइन जैसी चीजों का उपयोग कैसे किया जाता है , जिसका अर्थ है कि आपकी वेबसाइट और ब्राउज़र <-> सर्वर संचार कितना सुरक्षित है, यह अभी भी पार करने के लिए अपेक्षाकृत सरल है।


1

AMFPHP के माध्यम से बैकएंड के साथ संवाद करना एक अच्छा विचार हो सकता है । यह कम से कम आलसी लोगों को ब्राउज़र कंसोल के माध्यम से परिणामों को आगे बढ़ाने की कोशिश करने से हतोत्साहित करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.