2016-07-25 9 views
5

उदाहरण के लिए मैंने कुछ वेबसाइट पर एक स्क्रिप्ट लोड की है, और मैं जानना चाहता हूं कि JSON.parse/stringify बंदर पैच नहीं था या नहीं।क्या यह जांचने का कोई तरीका है कि मूल जावास्क्रिप्ट फ़ंक्शन बंदर था?

मैंने देखा है कि अगर मैं क्रोम/एफएफ, JSON.stringify.toString में समारोह पर toString उपयोग करते हैं, तो मैं वापस पाने:

function stringify() { 
    [native code] 
} 

मेरा प्रश्न आपको लगता है इस अगर एक समारोह था सत्यापित करने के लिए एक अच्छा तरीका है करना है बंदर पैच? इस समस्या के किसी अन्य दृष्टिकोण को भी सुनना अच्छा लगेगा।

+2

हो सकता है कि आप वेब स्कर्कर में अपनी स्क्रिप्ट चला सकें और फ़ंक्शन को मुख्य पृष्ठ से फ़ंक्शन में फ़ंक्शन से तुलना कर सकें। – Buzzy

उत्तर

4

हां, यह जांचने का एकमात्र व्यावहारिक तरीका है कि मूल कार्य को ओवरराइड किया गया था या नहीं।

const isNative = fn => !!fn.toString().match(/\[native code\]/) 

console.log(isNative(JSON.stringify)); 

एक और अधिक मजबूत समाधान fn.toString() के प्रत्यक्ष कॉल के बजाय Function.prototype.toString() इस्तेमाल कर सकते हैं, लेकिन दोनों के साथ-साथ monkeypatchable हैं। जावास्क्रिप्ट की खुशियों :)

4

एक आसानी से नकली JSON.stringify.toString

JSON.stringify = function() {} 
JSON.stringify.toString = function() {return 'ha-ha'} 

console.log(JSON.stringify); //ha-ha 

एक छोटी सी और अधिक मजबूत तरीका Function.prototype.toString

Function.prototype.toString.call(JSON.stringify) 

उपयोग करने के लिए लेकिन वास्तव में बुरा monkeypatcher Function.prototype.toString रूप में अच्छी तरह पैच सकता है :) होगा सकता है

3

spec (http://www.ecma-international.org/ecma-262/7.0/index.html#sec-function.prototype.tostring) बिल्टिन functi के लिए लौटाई गई सटीक स्ट्रिंग निर्दिष्ट नहीं करता है पर:

19.2.3.5 Function.prototype.toString

toString विधि एक वस्तु समारोह पर कहा जाता है, निम्नलिखित कदम उठाए हैं:

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

स्ट्रिंग प्रतिनिधित्व एक FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, ClassDeclaration, ClassExpression, ArrowFunction, MethodDefinition, या GeneratorMethod वस्तु के वास्तविक विशेषताओं के आधार पर की वाक्य रचना होना आवश्यक है। सफेद अंतरिक्ष का उपयोग और प्लेसमेंट, लाइन टर्मिनेटर, और प्रतिनिधित्व स्ट्रिंग के भीतर अर्धविराम कार्यान्वयन-निर्भर है।यदि वस्तु ECMAScript कोड और लौट आए स्ट्रिंग प्रतिनिधित्व का उपयोग कर परिभाषित किया गया था एक MethodDefinition या GeneratorMethod तो प्रतिनिधित्व इस तरह होना चाहिए के रूप में नहीं है कि अगर स्ट्रिंग मूल्यांकन किया जाता है, एक शाब्दिक संदर्भ कि के बराबर है में eval का उपयोग कर मूल ऑब्जेक्ट बनाने के लिए उपयोग किए जाने वाले व्याख्यात्मक संदर्भ के परिणामस्वरूप, यह एक नई कार्यात्मक समकक्ष वस्तु के परिणामस्वरूप होगा। में उस स्थिति में लौटाए गए स्रोत कोड को वेरिएबल का उल्लेख नहीं करना चाहिए, जिन्हें मूल फ़ंक्शन के स्रोत कोड द्वारा स्वतंत्र रूप से वर्णित नहीं किया गया था, भले ही इन "अतिरिक्त" नाम मूल रूप से दायरे में हों। यदि कार्यान्वयन स्रोत कोड स्ट्रिंग का उत्पादन नहीं कर सकता है जो इन मानदंडों को पूरा करता है तो उसे एक स्ट्रिंग वापस करनी होगी जिसके लिए eval एक SyntaxError अपवाद फेंक देगा।

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

तो आपके प्रश्न के उत्तर में, आप यह निर्धारित नहीं कर सकते कि जावास्क्रिप्ट निर्दिष्ट तरीका है कि एक बिल्टिन फ़ंक्शन बंदर-पैच किया गया है या नहीं।

ऐसा कहा जाता है कि ऐसा लगता है कि क्रोम और फ़ायरफ़ॉक्स दोनों [Native Code] स्ट्रिंग को अन्य कार्यान्वयन पर सत्यापन के अधीन लौटाते हैं जो व्यावहारिक समाधान हो सकता है।

+0

* "इसके अलावा, एक कार्यान्वयन सामान्य जावास्क्रिप्ट कोड के रूप में बिल्टिन कार्यों को अच्छी तरह कार्यान्वित कर सकता है।" * यह शायद कोई मुद्दा नहीं है। वी 8 का 'वादा' [जावास्क्रिप्ट में लागू किया गया है] (https://github.com/v8/v8/blob/986814218b907cbac244a3624362ee9351f6badb/src/js/promise.js) और 'Promise.toString()' अभी भी '[मूल कोड] है ' इस में। – noppa

+0

दिलचस्प .... – HBP

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

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