Facebook จะปิดการใช้งานเครื่องมือสำหรับนักพัฒนาที่ผสานรวมของเบราว์เซอร์อย่างไร


1685

เห็นได้ชัดว่าเนื่องจากการหลอกลวงเมื่อเร็ว ๆ นี้เครื่องมือของนักพัฒนาซอฟต์แวร์ถูกใช้โดยผู้คนเพื่อโพสต์สแปมและแม้แต่เคยใช้กับบัญชี "แฮ็ค" Facebook บล็อกเครื่องมือของนักพัฒนาซอฟต์แวร์และฉันไม่สามารถใช้คอนโซลได้

ป้อนคำอธิบายภาพที่นี่

พวกเขาทำอย่างนั้นได้อย่างไร ?? โพสต์ Stack Overflow หนึ่งโพสต์อ้างว่าเป็นไปไม่ได้แต่ Facebook พิสูจน์แล้วว่าพวกเขาทำผิด

เพียงไปที่ Facebook และเปิดเครื่องมือสำหรับนักพัฒนาพิมพ์อักขระหนึ่งตัวลงในคอนโซลและคำเตือนนี้จะปรากฏขึ้น ไม่ว่าคุณจะใส่อะไรเข้าไปก็จะไม่ถูกประหารชีวิต

เป็นไปได้อย่างไร?

พวกเขายังบล็อกการทำให้สมบูรณ์อัตโนมัติในคอนโซล:

ป้อนคำอธิบายภาพที่นี่


21
เพื่อความสนุก: console.log = function () {}
tnt-rox

คุณพบวิธีแก้ปัญหาสำหรับคุณสมบัติบล็อกอัตโนมัติที่สมบูรณ์ในคอนโซลหรือไม่
Akshay Hegde

1
@AkshayHegde มันเป็นผลข้างเคียงที่เกิดจากการบล็อกโค้ดจาก devtools
Derek 朕會功夫

@Derek 朕會功夫คุณกรุณาแบ่งปันรหัส
Akshay Hegde

เพียงแค่ fyi จะไม่ถูกบล็อกในโครเมี่ยมอีกต่อไป
จอห์นลอร์ด

คำตอบ:


2437

ฉันเป็นวิศวกรความปลอดภัยที่ Facebook และนี่คือความผิดของฉัน เรากำลังทดสอบสิ่งนี้สำหรับผู้ใช้บางคนเพื่อดูว่าสามารถชะลอการโจมตีบางอย่างที่ผู้ใช้ถูกหลอกให้วางโค้ด JavaScript (มุ่งร้าย) ลงในคอนโซลของเบราว์เซอร์

เพื่อให้ชัดเจน: การพยายามบล็อกแฮกเกอร์ฝั่งไคลเอ็นต์เป็นความคิดที่ไม่ดีโดยทั่วไป นี้คือการป้องกันการโจมตีวิศวกรรมทางสังคมที่เฉพาะเจาะจง

หากคุณลงเอยในกลุ่มทดสอบและรู้สึกรำคาญกับสิ่งนี้เสียใจ ฉันพยายามทำให้หน้าไม่เข้าร่วมเก่า (ตอนนี้เป็นหน้าช่วยเหลือ ) ง่ายที่สุดเท่าที่จะทำได้ในขณะที่ยังคงน่ากลัวพอที่จะหยุดผู้ที่ตกเป็นเหยื่อบางคน

รหัสจริงคล้ายกับลิงก์ของ @ joeldixon66 ; ของเรานั้นซับซ้อนกว่าเล็กน้อยโดยไม่มีเหตุผลที่ดี

Chrome ล้อมโค้ดคอนโซลทั้งหมดไว้

with ((console && console._commandLineAPI) || {}) {
  <code goes here>
}

... ดังนั้นไซต์console._commandLineAPIจะทำการกำหนดใหม่:

Object.defineProperty(console, '_commandLineAPI',
   { get : function() { throw 'Nooo!' } })

นี่ยังไม่เพียงพอ (ลองดู!)แต่นั่นเป็นเคล็ดลับหลัก


บทส่งท้าย: ทีม Chrome ตัดสินใจว่าการเอาชนะคอนโซลจาก JS ของฝั่งผู้ใช้นั้นเป็นข้อผิดพลาดและแก้ไขปัญหาซึ่งทำให้เทคนิคนี้ไม่ถูกต้อง หลังจากนั้นการป้องกันเพิ่มเติมถูกเพิ่มเพื่อให้ผู้ใช้ป้องกันตัวเองจาก XSS


10
Chrome ทำการอัปเดต แต่คนนี้ทำการแก้ไขอีกครั้ง: kspace.in/blog/2014/06/21/…
Roger Gajraj

3
@ ถึงตอนนี้หน้าการเลือกไม่ใช้ของคุณจะแสดงหน้าความช่วยเหลือโดยไม่มีความเป็นไปได้ที่จะปิดการป้องกันนี้
arm.localhost

168
โปรดอย่าทำลายเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์เนื่องจากความโง่เขลาของผู้ใช้บางคน "การแก้ปัญหา" เช่นนี้ทำให้ฉันเผาผลาญด้วยความโกรธล้านครั้ง
Jonathan Dunlap

85
ฉันคิดว่า Google ต้องเปิดตัว Chrome รุ่น "ปลอดภัย" ไม่มี DevTools และบังคับให้ทุกคนใช้การอัปเดตอัตโนมัติเพื่อเปลี่ยนเป็นรุ่นนี้เพียงครั้งเดียว นักพัฒนาใด ๆ ที่สังเกตเห็นความแตกต่างและต้องการ DevTools ควรดาวน์โหลดเวอร์ชัน "น่ากลัว" ในความเป็นจริงให้ระบุว่าเป็น "น่ากลัว" และ "ปลอดภัย" โดยตรงบนหน้าดาวน์โหลดและขัดขวางไม่ให้ชาวดาร์วินทำร้ายตนเองโดยระบุว่า "คุณมีแนวโน้มที่นี่เพราะการโจมตีทางวิศวกรรมสังคมบอกให้คุณดาวน์โหลดเวอร์ชั่นน่ากลัวโปรดอย่า ทำเช่นนี้." ขอพระเจ้าอวยพรให้คุณ devs FB สำหรับความคิดสร้างสรรค์!
MonkeyZeus

11
@ n00b console.logที่ข้อความแจ้งเตือนเป็นเพียง
gcampbell

91

ฉันพบสคริปต์คอนโซลมือปราบของ Facebook โดยใช้เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ของ Chrome นี่คือสคริปต์ที่มีการเปลี่ยนแปลงเล็กน้อยเพื่อให้อ่านง่าย ฉันได้ลบบิตที่ฉันไม่เข้าใจ:

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);

ด้วยสิ่งนี้การทำให้สมบูรณ์อัตโนมัติของคอนโซลจะล้มเหลวอย่างเงียบ ๆ ในขณะที่คำสั่งที่พิมพ์ในคอนโซลจะไม่สามารถดำเนินการได้ (ข้อยกเว้นจะถูกบันทึกไว้)

อ้างอิง:


48

ฉันไม่สามารถเรียกใช้มันในหน้าใด ๆ เวอร์ชั่นที่แข็งแกร่งกว่านี้จะทำ:

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

console.log('test');

ในการจัดรูปแบบผลลัพธ์: สีในคอนโซล JavaScript

Edit Thinking @ joeldixon66มีความคิดที่ถูกต้อง: ปิดการใช้งาน JavaScript จากคอนโซล« ::: KSpace :::


เจ๋ง แต่ก็ยังแทนที่เดิมwindow.console.log = function(){//empty}และใช้ console.log
เด็ดสุด ๆ

32

นอกจากการกำหนดใหม่console._commandLineAPIแล้วยังมีวิธีอื่นที่จะเจาะเข้าไปใน InjectedScriptHost บนเบราว์เซอร์ WebKit เพื่อป้องกันหรือปรับเปลี่ยนการประเมินผลของนิพจน์ที่ใส่เข้าไปในคอนโซลของนักพัฒนาซอฟต์แวร์

แก้ไข:

Chrome ได้แก้ไขสิ่งนี้ในรุ่นที่ผ่านมา - ซึ่งต้องเป็นก่อนเดือนกุมภาพันธ์ 2558 เนื่องจากฉันสร้างส่วนสำคัญในเวลานั้น

ดังนั้นนี่คือความเป็นไปได้อีกอย่าง ในครั้งนี้เราขอยกระดับระดับดังกล่าวเป็นโดยตรงInjectedScriptแทนที่จะInjectedScriptHostเป็นเวอร์ชั่นก่อนหน้า

ซึ่งเป็นสิ่งที่ดีเพราะคุณสามารถนำแผ่นแปะลิงโดยตรง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);

มันค่อนข้าง verbose แต่ฉันคิดว่าฉันใส่ความคิดเห็นลงไป

ตัวอย่างเช่นโดยปกติหากผู้ใช้ประเมิน[1,2,3,4]คุณจะคาดหวังผลลัพธ์ต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

หลังจาก monkeypatching InjectedScript._evaluateAndWrapประเมินนิพจน์เดียวกันให้ผลลัพธ์ต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ตามที่คุณเห็นลูกศรซ้ายเล็ก ๆ ที่แสดงเอาท์พุทยังคงอยู่ที่นั่น แต่คราวนี้เราได้รับวัตถุ โดยที่ผลลัพธ์ของนิพจน์นั้นอาร์เรย์[1,2,3,4]จะถูกแทนด้วยวัตถุที่มีคุณสมบัติทั้งหมดที่อธิบายไว้

ฉันขอแนะนำให้พยายามประเมินสิ่งนี้และนิพจน์นั้นรวมถึงสิ่งที่สร้างข้อผิดพลาด มันค่อนข้างน่าสนใจ

นอกจากนี้ให้ดูที่is - InjectedScriptHost-วัตถุ มันมีวิธีการบางอย่างในการเล่นและทำความเข้าใจภายในของผู้ตรวจสอบ

แน่นอนคุณสามารถดักจับข้อมูลนั้นทั้งหมดและยังคงส่งคืนผลลัพธ์ดั้งเดิมให้กับผู้ใช้

เพียงแค่เปลี่ยนคำสั่งกลับในเส้นทางอื่นโดยต่อไปนี้console.log (res) return resจากนั้นคุณจะจบลงด้วยการดังต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่

สิ้นสุดการแก้ไข


นี่เป็นรุ่นก่อนหน้าซึ่งได้รับการแก้ไขโดย Google ดังนั้นจึงไม่ใช่วิธีที่เป็นไปได้อีกต่อไป

หนึ่งในนั้นคือตะขอเข้า Function.prototype.call

Chrome จะประเมินค่านิพจน์ที่ป้อนโดยcallใช้ฟังก์ชัน eval ด้วยInjectedScriptHostเช่นthisArg

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

ให้นี้คุณสามารถฟังสำหรับthisArgการcallเป็นอยู่evaluateและได้รับการอ้างอิงถึงอาร์กิวเมนต์แรก ( InjectedScriptHost)

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);  
        }
    };
}

คุณสามารถส่งข้อผิดพลาดเช่นว่าการประเมินถูกปฏิเสธ

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือตัวอย่างที่นิพจน์ที่ป้อนได้รับการส่งผ่านไปยังคอมไพเลอร์ CoffeeScript ก่อนส่งผ่านไปยังevaluateฟังก์ชัน


25

Netflix ยังใช้งานฟีเจอร์นี้

(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เพื่อโยนข้อผิดพลาดความปลอดภัย


24

สิ่งนี้เป็นไปได้จริงตั้งแต่ Facebook สามารถทำเช่นนั้นได้ ไม่ใช่เครื่องมือสำหรับนักพัฒนาเว็บจริงๆ แต่เป็นการทำงานของ Javascript ในคอนโซล

ดูสิ่งนี้: Facebook จะปิดการใช้งานเครื่องมือสำหรับนักพัฒนารวมของเบราว์เซอร์อย่างไร

สิ่งนี้จะไม่ทำอะไรมากนักเนื่องจากมีวิธีอื่น ๆ ที่จะหลีกเลี่ยงการรักษาความปลอดภัยฝั่งไคลเอ็นต์ประเภทนี้

เมื่อคุณบอกว่ามันเป็นฝั่งไคลเอ็นต์มันเกิดขึ้นนอกการควบคุมของเซิร์ฟเวอร์ดังนั้นจึงไม่มีอะไรที่คุณสามารถทำได้ หากคุณถามว่าทำไม Facebook ถึงยังทำเช่นนี้ไม่ใช่เพื่อความปลอดภัย แต่เพื่อปกป้องผู้ใช้ปกติที่ไม่รู้จักจาวาสคริปต์ในการเรียกใช้รหัส (ที่พวกเขาไม่รู้วิธีอ่าน) ในคอนโซล นี่เป็นเรื่องปกติสำหรับเว็บไซต์ที่สัญญาบริการ auto-liker หรือฟังก์ชั่นบอท Facebook อื่น ๆ หลังจากที่คุณทำสิ่งที่พวกเขาขอให้คุณทำซึ่งโดยส่วนใหญ่แล้วพวกเขาจะให้จาวาสคริปต์ทำงานในคอนโซล

หากคุณไม่มีผู้ใช้มากเท่ากับ Facebook ฉันก็ไม่คิดว่าจะต้องทำสิ่งที่ Facebook ทำ

แม้ว่าคุณจะปิดการใช้งานจาวาสคริปต์ในคอนโซลการใช้จาวาสคริปต์ผ่านทางแถบที่อยู่ยังคงเป็นไปได้

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

และหากเบราว์เซอร์ปิดการใช้งานจาวาสคริปต์ที่แถบที่อยู่ (เมื่อคุณวางรหัสในแถบที่อยู่ใน Google Chrome มันจะลบวลี 'javascript:') การวางจาวาสคริปต์ในลิงค์ใดลิงก์หนึ่งผ่านองค์ประกอบการตรวจสอบก็ยังคงเป็นไปได้

ตรวจสอบจุดยึด:

ป้อนคำอธิบายรูปภาพที่นี่

วางรหัสใน href:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

บรรทัดล่างคือการตรวจสอบฝั่งเซิร์ฟเวอร์และความปลอดภัยควรเป็นอันดับแรกจากนั้นจึงทำการตรวจสอบฝั่งไคลเอ็นต์


11

Chrome มีการเปลี่ยนแปลงบ่อยครั้งที่ facebook สามารถปิดใช้งานคอนโซลได้ ...

เมื่อถึงเดือนมีนาคม 2560 สิ่งนี้จะไม่ทำงานอีกต่อไป

สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือปิดการใช้งานฟังก์ชั่นคอนโซลบางตัวเช่น:

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(){};
}

9

วิธีง่ายๆของฉัน แต่มันสามารถช่วยในการเปลี่ยนแปลงเพิ่มเติมในเรื่องนี้ ทำรายการวิธีการทั้งหมดและแก้ไขให้ไร้ประโยชน์

  Object.getOwnPropertyNames(console).filter(function(property) {
     return typeof console[property] == 'function';
  }).forEach(function (verb) {
     console[verb] =function(){return 'Sorry, for security reasons...';};
  });

5

devtools ภายในจะแทรก IIFE ที่มีชื่อgetCompletionsลงในเพจเรียกว่าเมื่อกดคีย์ภายในคอนโซล Devtools

เมื่อมองไปที่แหล่งที่มาของฟังก์ชั่นนั้นจะใช้ฟังก์ชั่นระดับโลกบางอย่างที่สามารถเขียนทับได้

โดยใช้ErrorConstructor เป็นไปได้ที่จะได้รับ call stack ซึ่งจะรวมถึงgetCompletionsเมื่อเรียกโดย Devtools


ตัวอย่าง:

const disableDevtools = callback => {
  const original = Object.getPrototypeOf;

  Object.getPrototypeOf = (...args) => {
    if (Error().stack.includes("getCompletions")) callback();
    return original(...args);
  };
};

disableDevtools(() => {
  console.error("devtools has been disabled");

  while (1);
});


ค่อนข้างเรียบร้อย แต่ก็ขัดข้องหน้าเว็บด้วย
Derek 朕會功夫

@Derek 朕會功夫วิธีเดียว (ฉันได้พบ) เพื่อระงับการป้อนข้อมูลของผู้ใช้เพิ่มเติม
samdd

ฉันสงสัยว่าคุณสามารถโยนข้อผิดพลาดแทนที่จะใช้วนซ้ำไม่สิ้นสุด แก้ไข: ทดสอบแล้วไม่ทำงาน
Derek 朕會功夫

@ ดีเร็ก朕會功夫มันอยู่ในลอง catch catch คุณอาจจะแทนที่ฟังก์ชั่นข้างต้นบล็อก แต่มันจะป้องกันไม่ให้เสร็จสิ้นโดยอัตโนมัติ (ไม่ประเมิน)
samdd

2

ทางออกที่ง่าย!

setInterval(()=>console.clear(),1500);

1
วิธีนี้จะปิดการใช้งานconsole.log()?
Red

1
console.log()ไม่สำคัญอีกต่อไปเมื่อคอนโซลล้างออกอย่างต่อเนื่อง :)
23932 Mohmmad Ebrahimi Aval

นี่เป็นความคิดที่ไม่ดี แฮกเกอร์สามารถติดตามจากเทอร์มินัลของพวกเขาและดูบันทึกทั้งหมด
GFxJamal

4
และถ้าคุณตั้งค่าสถานะบันทึกการบันทึก console.clear () จะไม่ทำอะไรเลย: P
Zibri


-2

นี่ไม่ใช่มาตรการรักษาความปลอดภัยสำหรับรหัสที่อ่อนแอที่จะถูกปล่อยโดยไม่ต้องใส่ข้อมูล รับโซลูชันถาวรสำหรับรหัสที่อ่อนแอและรักษาความปลอดภัยเว็บไซต์ของคุณอย่างถูกต้องก่อนใช้กลยุทธ์นี้

เครื่องมือที่ดีที่สุดตามความรู้ของฉันคือการเพิ่มไฟล์จาวาสคริปต์หลายไฟล์ที่เพียงแค่เปลี่ยนความสมบูรณ์ของหน้าเว็บกลับเป็นปกติโดยการรีเฟรชหรือแทนที่เนื้อหา การปิดใช้งานเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์นี้ไม่ใช่ความคิดที่ยิ่งใหญ่ที่สุดเนื่องจากการเลี่ยงผ่านเป็นปัญหาเสมอเนื่องจากรหัสเป็นส่วนหนึ่งของเบราว์เซอร์และไม่ใช่การแสดงผลของเซิร์ฟเวอร์ดังนั้นจึงอาจแตกได้

หากคุณมีการjs file oneตรวจสอบ<element>การเปลี่ยนแปลงองค์ประกอบที่สำคัญjs file twoและjs file threeตรวจสอบว่าไฟล์นี้มีอยู่ในแต่ละงวดคุณจะได้รับการคืนค่าความสมบูรณ์แบบเต็มรูปแบบในหน้าภายในระยะเวลา

ลองดูตัวอย่างของไฟล์ 4 ไฟล์แล้วแสดงให้ฉันเห็นว่าฉันหมายถึงอะไร

index.html

   <!DOCTYPE html>
   <html>
   <head id="mainhead">
   <script src="ks.js" id="ksjs"></script>
   <script src="mainfile.js" id="mainjs"></script>
   <link rel="stylesheet" href="style.css" id="style">
   <meta id="meta1" name="description" content="Proper mitigation against script kiddies via Javascript" >
   </head>
   <body>
   <h1 id="heading" name="dontdel" value="2">Delete this from console and it will refresh. If you change the name attribute in this it will also refresh. This is mitigating an attack on attribute change via console to exploit vulnerabilities. You can even try and change the value attribute from 2 to anything you like. If This script says it is 2 it should be 2 or it will refresh. </h1>
   <h3>Deleting this wont refresh the page due to it having no integrity check on it</h3>

   <p>You can also add this type of error checking on meta tags and add one script out of the head tag to check for changes in the head tag. You can add many js files to ensure an attacker cannot delete all in the second it takes to refresh. Be creative and make this your own as your website needs it. 
   </p>

   <p>This is not the end of it since we can still enter any tag to load anything from everywhere (Dependent on headers etc) but we want to prevent the important ones like an override in meta tags that load headers. The console is designed to edit html but that could add potential html that is dangerous. You should not be able to enter any meta tags into this document unless it is as specified by the ks.js file as permissable. <br>This is not only possible with meta tags but you can do this for important tags like input and script. This is not a replacement for headers!!! Add your headers aswell and protect them with this method.</p>
   </body>
   <script src="ps.js" id="psjs"></script>
   </html>

mainfile.js

   setInterval(function() {
   // check for existence of other scripts. This part will go in all other files to check for this file aswell. 
   var ksExists = document.getElementById("ksjs"); 
   if(ksExists) {
   }else{ location.reload();};

   var psExists = document.getElementById("psjs");
   if(psExists) {
   }else{ location.reload();};

   var styleExists = document.getElementById("style");
   if(styleExists) {
   }else{ location.reload();};


   }, 1 * 1000); // 1 * 1000 milsec

ps.js

   /*This script checks if mainjs exists as an element. If main js is not existent as an id in the html file reload!You can add this to all js files to ensure that your page integrity is perfect every second. If the page integrity is bad it reloads the page automatically and the process is restarted. This will blind an attacker as he has one second to disable every javascript file in your system which is impossible.

   */

   setInterval(function() {
   // check for existence of other scripts. This part will go in all other files to check for this file aswell. 
   var mainExists = document.getElementById("mainjs"); 
   if(mainExists) {
   }else{ location.reload();};

   //check that heading with id exists and name tag is dontdel.
   var headingExists = document.getElementById("heading"); 
   if(headingExists) {
   }else{ location.reload();};
   var integrityHeading = headingExists.getAttribute('name');
   if(integrityHeading == 'dontdel') {
   }else{ location.reload();};
   var integrity2Heading = headingExists.getAttribute('value');
   if(integrity2Heading == '2') {
   }else{ location.reload();};
   //check that all meta tags stay there
   var meta1Exists = document.getElementById("meta1"); 
   if(meta1Exists) {
   }else{ location.reload();};

   var headExists = document.getElementById("mainhead"); 
   if(headExists) {
   }else{ location.reload();};

   }, 1 * 1000); // 1 * 1000 milsec

ks.js

   /*This script checks if mainjs exists as an element. If main js is not existent as an id in the html file reload! You can add this to all js files to ensure that your page integrity is perfect every second. If the page integrity is bad it reloads the page automatically and the process is restarted. This will blind an attacker as he has one second to disable every javascript file in your system which is impossible.

   */

   setInterval(function() {
   // check for existence of other scripts. This part will go in all other files to check for this file aswell. 
   var mainExists = document.getElementById("mainjs"); 
   if(mainExists) {
   }else{ location.reload();};
   //Check meta tag 1 for content changes. meta1 will always be 0. This you do for each meta on the page to ensure content credibility. No one will change a meta and get away with it. Addition of a meta in spot 10, say a meta after the id="meta10" should also be covered as below.
   var x = document.getElementsByTagName("meta")[0];
   var p = x.getAttribute("name");
   var s = x.getAttribute("content");
   if (p != 'description') {
   location.reload();
   }
   if ( s != 'Proper mitigation against script kiddies via Javascript') {
   location.reload();
   }
   // This will prevent a meta tag after this meta tag @ id="meta1". This prevents new meta tags from being added to your pages. This can be used for scripts or any tag you feel is needed to do integrity check on like inputs and scripts. (Yet again. It is not a replacement for headers to be added. Add your headers aswell!)
   var lastMeta = document.getElementsByTagName("meta")[1];
   if (lastMeta) {
   location.reload();
   }
   }, 1 * 1000); // 1 * 1000 milsec

style.css

ตอนนี้เป็นเพียงการแสดงให้เห็นว่ามันใช้งานได้กับไฟล์และแท็กทั้งหมดเช่นกัน

   #heading {
   background-color:red;
   }

หากคุณรวมไฟล์เหล่านี้เข้าด้วยกันและสร้างตัวอย่างคุณจะเห็นฟังก์ชั่นการวัดนี้ วิธีนี้จะช่วยป้องกันการแทรกซึมที่ไม่พึงประสงค์หากคุณใช้อย่างถูกต้องกับองค์ประกอบที่สำคัญทั้งหมดในไฟล์ดัชนีของคุณโดยเฉพาะเมื่อทำงานกับ PHP

เหตุใดฉันจึงเลือกโหลดซ้ำแทนที่จะเปลี่ยนกลับเป็นค่าปกติต่อแอตทริบิวต์คือความจริงที่ว่าผู้โจมตีบางคนอาจมีส่วนอื่นของเว็บไซต์ที่กำหนดค่าไว้แล้วและพร้อมและลดจำนวนรหัสลง การโหลดซ้ำจะเป็นการลบการทำงานหนักของผู้โจมตีและเขาอาจจะไปเล่นที่อื่นได้ง่ายขึ้น

หมายเหตุอื่น: สิ่งนี้อาจกลายเป็นรหัสจำนวนมากดังนั้นควรรักษาความสะอาดและตรวจสอบให้แน่ใจว่าได้เพิ่มคำจำกัดความที่พวกเขาอยู่เพื่อแก้ไขได้ง่ายในอนาคต ตั้งค่าวินาทีตามจำนวนที่คุณต้องการเป็นช่วงเวลา 1 วินาทีบนหน้าขนาดใหญ่อาจมีผลกระทบรุนแรงกับคอมพิวเตอร์รุ่นเก่าที่ผู้เยี่ยมชมของคุณอาจใช้


นี่ ... นี่ไม่ใช่วิธีการที่ดี
RozzA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.