javascript फेसबुक ब्राउज़र के एकीकृत डेवलपर टूल को कैसे अक्षम करता है?




facebook google-chrome-devtools (6)

तो जाहिर है हाल के घोटालों के कारण, डेवलपर टूल का उपयोग लोगों द्वारा स्पैम पोस्ट करने के लिए किया जाता है और यहां तक ​​कि खातों को "हैक" करने के लिए भी उपयोग किया जाता है। फेसबुक ने डेवलपर टूल्स को अवरुद्ध कर दिया है, और मैं कंसोल का भी उपयोग नहीं कर सकता।

उन्होंने ऐसा कैसे किया?? वन स्टैक ओवरफ्लो पोस्ट ने दावा किया कि यह संभव नहीं है , लेकिन फेसबुक ने उन्हें गलत साबित कर दिया है।

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

यह कैसे संभव है?

उन्होंने कंसोल में ऑटो-पूर्ण भी अवरुद्ध कर दिया:

https://code.i-harness.com


क्रोम कंसोल अक्षम कर सकता है जब से क्रोम बहुत बदल गया ...

मार्च 2017 के अनुसार यह अब और काम नहीं करता है।

आप जो कुछ भी कर सकते हैं वह कंसोल फ़ंक्शंस को अक्षम कर सकता है, उदाहरण:

if(!window.console) window.console = {};
var methods = ["log", "debug", "warn", "info", "dir", "dirxml", "trace", "profile"];
for(var i=0;i<methods.length;i++){
    console[methods[i]] = function(){};
}

नेटफ्लिक्स भी इस सुविधा को लागू करता है

(function() {
    try {
        var $_console$$ = console;
        Object.defineProperty(window, "console", {
            get: function() {
                if ($_console$$._commandLineAPI)
                    throw "Sorry, for security reasons, the script console is deactivated on netflix.com";
                return $_console$$
            },
            set: function($val$$) {
                $_console$$ = $val$$
            }
        })
    } catch ($ignore$$) {
    }
})();

वे सिर्फ सुरक्षा त्रुटि फेंकने के लिए console._commandLineAPI को ओवरराइड करते हैं।


मैं इसे किसी भी पेज पर ट्रिगर करने के लिए नहीं मिला। इसका एक और मजबूत संस्करण यह करेगा:

window.console.log = function(){
    console.error('The developer console is temp...');
    window.console.log = function() {
        return false;
    }
}

console.log('test');

आउटपुट शैली बनाने के लिए: जावास्क्रिप्ट कंसोल में रंग

@joeldixon66 का सही विचार है: कंसोल से जावास्क्रिप्ट निष्पादन अक्षम करें :: ::: केस्पेस :::


मैं क्रोम डेवलपर टूल का उपयोग कर फेसबुक की कंसोल बस्टर स्क्रिप्ट में स्थित हूं। पठनीयता के लिए मामूली परिवर्तन के साथ स्क्रिप्ट यहां दी गई है। मैंने उन बिट्स को हटा दिया है जिन्हें मैं समझ नहीं पाया:

Object.defineProperty(window, "console", {
    value: console,
    writable: false,
    configurable: false
});

var i = 0;
function showWarningAndThrow() {
    if (!i) {
        setTimeout(function () {
            console.log("%cWarning message", "font: 2em sans-serif; color: yellow; background-color: red;");
        }, 1);
        i = 1;
    }
    throw "Console is disabled";
}

var l, n = {
        set: function (o) {
            l = o;
        },
        get: function () {
            showWarningAndThrow();
            return l;
        }
    };
Object.defineProperty(console, "_commandLineAPI", n);
Object.defineProperty(console, "__commandLineAPI", n);

इसके साथ, कंसोल ऑटो-पूर्ण चुपचाप विफल रहता है जबकि कंसोल में टाइप किए गए बयान निष्पादित करने में विफल हो जाएंगे (अपवाद लॉग किया जाएगा)।

संदर्भ:


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

इसे देखें: फेसबुक ब्राउज़र के एकीकृत डेवलपर टूल को कैसे अक्षम करता है?

यह वास्तव में बहुत कुछ नहीं करेगा हालांकि इस प्रकार के क्लाइंट-साइड सुरक्षा को बाईपास करने के अन्य तरीके हैं।

जब आप कहते हैं कि यह क्लाइंट-साइड है, तो यह सर्वर के नियंत्रण से बाहर होता है, इसलिए इसके बारे में आप इतना कुछ नहीं कर सकते हैं। यदि आप पूछ रहे हैं कि फेसबुक अभी भी ऐसा क्यों करता है, तो यह वास्तव में सुरक्षा के लिए नहीं है बल्कि सामान्य उपयोगकर्ताओं की सुरक्षा के लिए है जो कंसोल में कोड चलाने से जावास्क्रिप्ट को नहीं जानते हैं (जिन्हें वे पढ़ना नहीं चाहते हैं)। यह उन साइटों के लिए आम है जो आपके द्वारा किए जाने वाले कार्यों के बाद ऑटो-पसंद सेवा या अन्य फेसबुक कार्यक्षमता बॉट का वादा करते हैं, जहां ज्यादातर मामलों में, वे आपको कंसोल में चलाने के लिए जावास्क्रिप्ट का एक स्निप देते हैं।

यदि आपके पास फेसबुक के जितने उपयोगकर्ता नहीं हैं, तो मुझे नहीं लगता कि फेसबुक करने के लिए कोई ज़रूरत है।

भले ही आप कंसोल में जावास्क्रिप्ट को अक्षम करते हैं, फिर भी पता बार के माध्यम से जावास्क्रिप्ट चलाना अभी भी संभव है।

और यदि ब्राउज़र पता बार पर जावास्क्रिप्ट को अक्षम करता है, (जब आप Google क्रोम में पता बार में कोड पेस्ट करते हैं, तो यह वाक्यांश 'जावास्क्रिप्ट:' वाक्यांश को हटा देता है) जावास्क्रिप्ट चिपकाने वाले तत्वों के माध्यम से लिंक में से किसी एक में चिपकाना अभी भी संभव है।

एंकर का निरीक्षण करें:

Href में कोड पेस्ट करें:

नीचे की रेखा सर्वर-साइड सत्यापन है और सुरक्षा पहले होनी चाहिए, उसके बाद क्लाइंट-साइड करें।


console._commandLineAPI फिर से परिभाषित करने के अलावा, डेवलपर के कंसोल में दर्ज अभिव्यक्तियों के मूल्यांकन को रोकने या बदलने के लिए, वेबकिट ब्राउज़र पर इंजेक्शनस्क्रिप्टहोस्ट में तोड़ने के कुछ अन्य तरीके हैं।

संपादित करें:

क्रोम ने इसे पिछले रिलीज में तय कर दिया है। - जो फरवरी 2015 से पहले होना चाहिए, क्योंकि मैंने उस समय गिस्ट बनाया था

तो यहाँ एक और संभावना है। इस बार हम पूर्व संस्करण के विपरीत InjectedScriptHost InjectedScript बजाय InjectedScript में सीधे ऊपर एक स्तर में हुक करते हैं।

जो कि अच्छा है, क्योंकि आप सीधे InjectedScript._evaluateAndWrap पर भरोसा करने के बजाय पैच कर सकते हैं। InjectedScriptHost.evaluate क्योंकि इससे आपको क्या होना चाहिए इसके बारे में अधिक बढ़िया नियंत्रण देता है।

एक और दिलचस्प बात यह है कि जब हम अभिव्यक्ति का मूल्यांकन करते हैं तो हम आंतरिक परिणाम को रोक सकते हैं और सामान्य व्यवहार के बजाए उपयोगकर्ता को वापस कर सकते हैं।

यहां कोड है, जो वास्तव में करता है, जब उपयोगकर्ता कंसोल में कुछ मूल्यांकन करता है तो आंतरिक परिणाम लौटाता है।

var is;
Object.defineProperty(Object.prototype,"_lastResult",{
   get:function(){
       return this._lR;
   },
   set:function(v){
       if (typeof this._commandLineAPIImpl=="object") is=this;
       this._lR=v;
   }
});
setTimeout(function(){
   var ev=is._evaluateAndWrap;
   is._evaluateAndWrap=function(){
       var res=ev.apply(is,arguments);
       console.log();
       if (arguments[2]==="completion") {
           //This is the path you end up when a user types in the console and autocompletion get's evaluated

           //Chrome expects a wrapped result to be returned from evaluateAndWrap.
           //You can use `ev` to generate an object yourself.
           //In case of the autocompletion chrome exptects an wrapped object with the properties that can be autocompleted. e.g.;
           //{iGetAutoCompleted: true}
           //You would then go and return that object wrapped, like
           //return ev.call (is, '', '({test:true})', 'completion', true, false, true);
           //Would make `test` pop up for every autocompletion.
           //Note that syntax as well as every Object.prototype property get's added to that list later,
           //so you won't be able to exclude things like `while` from the autocompletion list,
           //unless you wou'd find a way to rewrite the getCompletions function.
           //
           return res; //Return the autocompletion result. If you want to break that, return nothing or an empty object
       } else {
           //This is the path where you end up when a user actually presses enter to evaluate an expression.
           //In order to return anything as normal evaluation output, you have to return a wrapped object.

           //In this case, we want to return the generated remote object. 
           //Since this is already a wrapped object it would be converted if we directly return it. Hence,
           //`return result` would actually replicate the very normal behaviour as the result is converted.
           //to output what's actually in the remote object, we have to stringify it and `evaluateAndWrap` that object again.`
           //This is quite interesting;
           return ev.call (is, null, '(' + JSON.stringify (res) + ')', "console", true, false, true)
       }
   };
},0);

यह थोड़ा वर्बोज़ है, लेकिन मैंने सोचा कि मैंने इसमें कुछ टिप्पणियां डाली हैं

तो आम तौर पर, यदि कोई उपयोगकर्ता, उदाहरण के लिए, [1,2,3,4] मूल्यांकन करता है तो आप निम्न आउटपुट की अपेक्षा करेंगे:

InjectedScript._evaluateAndWrap करने के बाद InjectedScript._evaluateAndWrap evaluateAndWrap एक ही अभिव्यक्ति का मूल्यांकन, निम्नलिखित आउटपुट देता है:

जैसा कि आप छोटे-बाएं तीर देखते हैं, आउटपुट इंगित करते हैं, अभी भी वहां है, लेकिन इस बार हमें एक वस्तु मिलती है। अभिव्यक्ति का परिणाम कहां, सरणी [1,2,3,4] को ऑब्जेक्ट के रूप में दर्शाया गया है जिसमें इसकी सभी गुणों का वर्णन किया गया है।

मैं इस और अभिव्यक्ति का मूल्यांकन करने की कोशिश करने की सलाह देता हूं, जिसमें त्रुटियां उत्पन्न होती हैं। यह काफी दिलचस्प है।

इसके अतिरिक्त, InjectedScriptHost - ऑब्जेक्ट पर एक नज़र डालें। यह इंस्पेक्टर के आंतरिक में अंतर्दृष्टि के साथ खेलने और कुछ अंतर्दृष्टि प्राप्त करने के कुछ तरीके प्रदान करता है।

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

return res बाद बस console.log (res) द्वारा अन्य पथ में रिटर्न स्टेटमेंट को प्रतिस्थापित करें। फिर आप निम्नलिखित के साथ खत्म हो जाएगा।

संपादन का अंत

यह पहला संस्करण है जिसे Google द्वारा तय किया गया था। इसलिए अब एक संभावित तरीका नहीं है।

इसमें से एक Function.prototype.call में hooking है

Chrome इस InjectedScriptHost रूप में InjectedScriptHost साथ अपने eval फ़ंक्शन को call करके दर्ज अभिव्यक्ति का मूल्यांकन करता है

var result = evalFunction.call(object, expression);

यह देखते हुए, आप call इस thisArg का evaluate कर सकते हैं और पहले तर्क ( InjectedScriptHost thisArg का संदर्भ प्राप्त कर सकते हैं।

if (window.URL) {
    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);  
        }
    };
}

आप एक त्रुटि फेंक सकते हैं, कि मूल्यांकन अस्वीकार कर दिया गया था।

यहां एक example जहां evaluate फ़ंक्शन को पास करने से पहले दर्ज की गई अभिव्यक्ति को कॉफीस्क्रिप्ट कंपाइलर को पास किया evaluate है।





google-chrome-devtools