2013-10-07 19 views
13

मैं एचटीएमएल/जावास्क्रिप्ट में एक वेब अनुप्रयोग पर काम कर रहा हूं, और मैं उपयोगकर्ताओं को धोखाधड़ी से बचने के लिए अपने ब्राउज़र कंसोल में फ़ंक्शन कॉल करने से रोकना चाहता हूं। इन सभी कार्यों को functions.js नामक एक अनूठी फ़ाइल में निहित किया गया है जो index.html फ़ाइल के प्रमुख में लोड किया गया है।ब्राउज़र कंसोल से जावास्क्रिप्ट फ़ंक्शन कॉल को कैसे अक्षम करें?

वेब मैं इस समाधान है, जो गूगल क्रोम में ठीक काम करता है पाया पर एक खोज के बाद, लेकिन यह इस तरह Firefox जैसे दूसरे ब्राउज़र में अक्षम है:

var _z = console; 
Object.defineProperty(window, "console", { 
    get : function(){if(_z._commandLineAPI){ throw "Script execution not permitted" } return _z; }, 
    set : function(val){ _z = val } 
}); 

वहाँ निष्क्रिय करने के लिए कार्यों से फोन एक सामान्य तरीका है सांत्वना? क्या यह ब्राउज़र पर निर्भर करता है या क्या यह सिर्फ स्कोपिंग की समस्या है या शायद कुछ और जिसे मैंने अनदेखा किया है?

+2

भले ही आपने किया हो, फिर भी आप ब्राउज़र बार –

+0

से फ़ंक्शंस निष्पादित कर सकते हैं जो आपने पाया है आपकी स्क्रिप्ट के लिए 'कंसोल' ऑब्जेक्ट को अक्षम करता है, लेकिन उपयोगकर्ताओं को ब्राउज़र कंसोल का उपयोग करने में बाधा नहीं डालता है। – Bergi

+1

आप जो भी ब्राउज़र में करते हैं वह उपयोगकर्ता पूर्ववत कर सकता है। आप कुछ भी छिपा नहीं सकते हैं, और जो भी आप उपयोगकर्ता को अक्षम करते हैं, वह फिर से सक्षम हो सकता है। मुझे यकीन नहीं है कि आप क्या 'धोखाधड़ी' को रोकने की कोशिश कर रहे हैं, लेकिन इसे क्लाइंट पक्ष करना विश्वसनीय नहीं होगा। –

उत्तर

16

क्या कंसोल से फ़ंक्शंस कॉल अक्षम करने का कोई सामान्य तरीका है?

नहीं। आप नहीं कर सकते। कभी नहीं। ठीक है, जाहिरा तौर पर फेसबुक गूगल क्रोम में एक रास्ता मिल गया: How does Facebook disable the browser's integrated Developer Tools? - हालांकि मैं इसे एक बग :-)

पर विचार करेंगे यह शायद कुछ और ही है कि मैं नजरअंदाज किया है है?

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

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

+0

फेसबुक कंसोल जाओ और कुछ भी टाइप करें ... उन्होंने डेटा कैसे किया? ??? ??? –

+2

@KeoStrife: https://www.facebook.com/ पर अपने ब्राउज़र के devtools कंसोल खोलने, "फेसबुक कंसोल" द्वारा आपका क्या मतलब है? क्या काम नहीं करेगा? आप किस ब्राउजर का उपयोग करते हैं, आपने किस प्रकार टाइप किया था? – Bergi

+0

@KeoStrife: मैं देखता हूं कि अब आपका क्या मतलब है। [फेसबुक डेवलपर टूल्स को कैसे अक्षम करता है?] (Http://stackoverflow.com/q/21692646/1048572) – Bergi

2

कंसोल तक पहुंच को समाप्त करने के बजाय, बस अपने जावास्क्रिप्ट को कोड करें ताकि यह वैश्विक नामस्थान को प्रदूषित न करे। यह कर देगा यह बहुत कठिन है (या साधारण मामलों लगभग असंभव में) अपने कोड निष्पादित करने के लिए कंसोल या पता पट्टी से मार डाला कोड के लिए: https://stackoverflow.com/a/1841941/1358220

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

+4

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

+0

ऐय यह सही नहीं है, लेकिन चूंकि वह कोड को उद्धृत नहीं कर रहा है, वह 'रक्षा' करने की कोशिश कर रहा है, इसलिए बंद होने से कंसोल को अपंग करने से संभावित रूप से कम आक्रामक समाधान होता है। –

+0

हालांकि देव उपकरण में स्रोत को संपादित करना बहुत आसान है। –

0

Minify किसी भी अर्थ को अपमानित करने के लिए आपका जावास्क्रिप्ट स्रोत। यह धोखा देना असंभव नहीं होगा, लेकिन धोखा देने के तरीकों को समझना वाकई मुश्किल है।

0
if (window.webkitURL) { 
    var ish, _call = Function.prototype.call; 
    Function.prototype.call = function() { //Could be wrapped in a setter for _commandLineAPI, to redefine only when the user started typing. 
     if (arguments.length > 0 && this.name === "evaluate" && arguments [0].constructor.name === "InjectedScriptHost") { //If thisArg is the evaluate function and the arg0 is the ISH 
      ish = arguments[0]; 
      ish.evaluate = function (e) { //Redefine the evaluation behaviour 
       throw new Error ('Rejected evaluation of: \n\'' + e.split ('\n').slice(1,-1).join ("\n") + '\''); 
      }; 
      Function.prototype.call = _call; //Reset the Function.prototype.call 
      return _call.apply(this, arguments); 
     } 
    }; 
} 
+0

कॉल फ़ंक्शन क्लाइंट द्वारा फिर से बदला जा सकता है। – Domi

0

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

ऐसे Facebook API, Google Caja और अधिक आप मनमाने ढंग से "फिर से लेखन" भाषा (वे पर एक पार्सर चलाने के लिए और मूल रूप से फिर से संकलन उपयोगकर्ता के दिए गए कोड और सब कुछ है कि असुरक्षित सुरक्षित है बनाने के द्वारा किसी भी बाधाओं को लागू करने की अनुमति के रूप में Sandboxes)। यह तब तक काम करता है जब तक आप यह सुनिश्चित कर सकें कि उपयोगकर्ता कोड केवल इन वातावरणों के अंदर ही चलाया जा सकता है। इस प्रकार अन्य उपयोगकर्ताओं के कोड आपके क्लाइंट के साथ गड़बड़ नहीं कर सकते हैं, लेकिन आप निश्चित रूप से अभी भी अपने क्लाइंट के साथ गड़बड़ कर सकते हैं।

संबंधित मुद्दे