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