Câu hỏi Facebook làm thế nào để vô hiệu hóa các công cụ phát triển tích hợp của trình duyệt?


Vì vậy, rõ ràng vì những trò gian lận gần đây, các công cụ phát triển được khai thác bởi mọi người để gửi thư rác và thậm chí được sử dụng để "hack" tài khoản. Facebook đã chặn các công cụ phát triển và thậm chí tôi không thể sử dụng bảng điều khiển.

Enter image description here

Họ đã làm điều đó như thế nào ?? Một bài đăng tràn ngăn xếp tuyên bố rằng không thể, nhưng Facebook đã chứng minh họ sai.

Chỉ cần vào Facebook và mở các công cụ phát triển, nhập một ký tự vào bảng điều khiển và cảnh báo này bật lên. Không có vấn đề gì bạn đưa vào, nó sẽ không được thực hiện.

Sao có thể như thế được?

Họ thậm chí còn bị chặn tự động hoàn thành trong bảng điều khiển:

Enter image description here


1561
2018-02-11 03:42


gốc


Chỉ để cho vui: console.log = function () {} - tnt-rox


Các câu trả lời:


Tôi là kỹ sư bảo mật tại Facebook và đây là lỗi của tôi. Chúng tôi đang thử nghiệm điều này cho một số người dùng để xem liệu nó có thể làm chậm một số cuộc tấn công mà người dùng bị lừa khi dán mã JavaScript (độc hại) vào bảng điều khiển của trình duyệt hay không.

Chỉ cần được rõ ràng: cố gắng để chặn tin tặc phía khách hàng là một ý tưởng tồi nói chung; điều này là để bảo vệ chống lại cuộc tấn công kỹ thuật xã hội cụ thể.

Nếu bạn đã kết thúc trong nhóm thử nghiệm và bị làm phiền bởi điều này, xin lỗi. Tôi đã cố gắng tạo trang chọn không tham gia cũ (hiện tại trang trợ giúp) càng đơn giản càng tốt trong khi vẫn đủ đáng sợ để ngăn chặn ít nhất một số của các nạn nhân.

Mã thực tế khá giống với @ joeldixon66's link; chúng ta phức tạp hơn một chút vì không có lý do chính đáng.

Chrome kết thúc tất cả mã bảng điều khiển trong

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

... do đó trang web xác định lại console._commandLineAPI ném:

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

Đây là không đủ (thử nó!), nhưng đó là lừa chính.


Lời kết: Nhóm Chrome đã quyết định đánh bại bảng điều khiển từ JS bên người dùng là lỗi và khắc phục vấn đề, hiển thị kỹ thuật này không hợp lệ. Sau đó, bảo vệ bổ sung đã được thêm vào bảo vệ người dùng khỏi tự xss.


2284
2018-02-11 05:33



Chrome đã cập nhật nhưng anh chàng này đã sửa lại: kspace.in/blog/2014/06/21/… - Roger Gajraj
@Alf, trang chọn không tham gia của bạn hiện hiển thị trang trợ giúp mà không có bất kỳ khả năng nào để tắt bảo vệ này. - arm.localhost
Xin vui lòng không phá vỡ các công cụ phát triển vì một số ngu ngốc của người dùng. "Giải pháp" như thế này khiến tôi cháy bỏng với hàng triệu mặt trời. - Jonathan Dunlap
Tôi nghĩ Google cần phát hành phiên bản "An toàn" của Chrome, không có DevTools và buộc bất kỳ ai cập nhật tự động chuyển sang phiên bản này chỉ một lần. Bất kỳ nhà phát triển nào thực sự nhận thấy sự khác biệt và cần DevTools nên tải xuống phiên bản "đáng sợ". Trên thực tế, gắn nhãn chúng là "Đáng sợ" và "An toàn" trực tiếp trên trang tải xuống và ngăn Darwin tự gây tổn hại bằng cách tuyên bố rõ ràng rằng "Bạn có khả năng ở đây vì một cuộc tấn công kỹ thuật xã hội đã cho bạn tải xuống phiên bản đáng sợ; làm cái này." Xin Chúa ban phước cho các nhà phát triển FB vì đã sáng tạo! - MonkeyZeus
@ n00b Thông điệp cảnh báo đó chỉ là console.log. - gcampbell


Tôi đặt kịch bản giao diện điều khiển của Facebook bằng cách sử dụng các công cụ dành cho nhà phát triển Chrome. Đây là kịch bản với những thay đổi nhỏ cho khả năng đọc. Tôi đã gỡ bỏ các bit mà tôi không thể hiểu được:

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

Với điều này, giao diện điều khiển tự động hoàn thành không thành công âm thầm trong khi các câu lệnh được nhập trong bảng điều khiển sẽ không thực hiện được (ngoại lệ sẽ được ghi lại).

Tham khảo:


73
2018-02-15 08:16





Tôi không thể kích hoạt nó trên bất kỳ trang nào. Một phiên bản mạnh mẽ hơn của điều này sẽ làm điều đó:

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

console.log('test');

Để tạo kiểu cho đầu ra: Màu sắc trong bảng điều khiển JavaScript

Chỉnh sửa Suy nghĩ @ joeldixon66 có ý tưởng đúng: Tắt thực thi JavaScript từ giao diện điều khiển «::: KSpace :::


37
2018-02-11 04:02



mát mẻ nhưng vẫn ghi đè lên window.console.log = function(){//empty} và sử dụng console.log - super cool


Bên cạnh việc xác định lại console._commandLineAPI, có một số cách khác để đột nhập vào InjectedScriptHost trên trình duyệt WebKit, để ngăn chặn hoặc thay đổi đánh giá các biểu thức được nhập vào bảng điều khiển của nhà phát triển.

Chỉnh sửa:

Chrome đã khắc phục điều này trong bản phát hành trước đây. - trước đó phải là trước tháng 2 năm 2015, khi tôi tạo ra ý chính tại thời điểm đó 

Đây là một khả năng khác. Lần này chúng ta móc vào, một cấp ở trên, trực tiếp vào InjectedScript thay vì InjectedScriptHost trái ngược với phiên bản trước.

Đó là loại tốt đẹp, như bạn có thể trực tiếp khỉ vá InjectedScript._evaluateAndWrap thay vì phải dựa vào InjectedScriptHost.evaluate vì điều đó cho phép bạn kiểm soát chi tiết hơn về những gì sẽ xảy ra.

Một điều khá thú vị là, chúng ta có thể đánh chặn kết quả bên trong khi một biểu thức được đánh giá và trả lại cho người dùng thay vì hành vi bình thường.

Đây là mã, thực hiện chính xác điều đó, trả về kết quả nội bộ khi người dùng đánh giá một cái gì đó trong bảng điều khiển.

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

Đó là một chút tiết, nhưng tôi nghĩ rằng tôi đưa một số ý kiến ​​vào nó

Vì vậy, thông thường, nếu một người dùng, ví dụ, đánh giá [1,2,3,4] bạn mong đợi kết quả sau:

enter image description here 

Sau khi bắt chước InjectedScript._evaluateAndWrap đánh giá cùng một biểu thức, cho kết quả sau:

enter image description here

Khi bạn nhìn thấy mũi tên nhỏ bên trái, cho biết đầu ra, vẫn còn đó, nhưng lần này chúng ta nhận được một đối tượng. Trường hợp kết quả của biểu thức, mảng [1,2,3,4] được biểu diễn như một đối tượng với tất cả các thuộc tính của nó được mô tả.

Tôi khuyên bạn nên cố gắng đánh giá biểu thức này và biểu thức đó, bao gồm cả những lỗi tạo ra lỗi. Nó khá thú vị.

Ngoài ra, hãy xem is  - - InjectedScriptHost - - vật. Nó cung cấp một số phương pháp để chơi với và có được một chút thông tin chi tiết vào bên trong của thanh tra viên.

Tất nhiên, bạn có thể chặn tất cả thông tin đó và vẫn trả lại kết quả ban đầu cho người dùng.

Chỉ cần thay thế câu lệnh return trong đường dẫn khác bằng một console.log (res) sau một return res. Sau đó, bạn sẽ kết thúc với những điều sau đây.

enter image description here 

Kết thúc chỉnh sửa 


Đây là phiên bản trước đã được Google sửa. Do đó không phải là một cách có thể nữa.

Một trong số đó là hooking Function.prototype.call

Chrome đánh giá biểu thức được nhập bởi calling chức năng eval của nó với InjectedScriptHost như thisArg


26
2018-02-19 14:49





Netflix cũng triển khai tính năng này

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

Họ chỉ ghi đè console._commandLineAPI để ném lỗi bảo mật.


19
2018-03-06 06:20





Điều này là thực sự có thể kể từ khi Facebook đã có thể làm điều đó. Vâng, không phải các công cụ phát triển web thực tế nhưng thực thi Javascript trong bảng điều khiển.

Xem này: Facebook làm thế nào để vô hiệu hóa các công cụ phát triển tích hợp của trình duyệt?

Điều này thực sự sẽ không làm nhiều mặc dù vì có nhiều cách khác để bỏ qua loại bảo mật phía máy khách này.

Khi bạn nói nó là phía máy khách, nó xảy ra bên ngoài sự kiểm soát của máy chủ, do đó, không có nhiều bạn có thể làm gì về nó. Nếu bạn đang hỏi tại sao Facebook vẫn thực hiện điều này, điều này không thực sự bảo mật nhưng để bảo vệ người dùng bình thường mà không biết javascript từ mã đang chạy (rằng họ không biết cách đọc) vào bảng điều khiển. Điều này là phổ biến cho các trang web hứa hẹn dịch vụ tự động theo dõi hoặc các chương trình chức năng khác của Facebook sau khi bạn làm những gì họ yêu cầu bạn làm, trong hầu hết các trường hợp, chúng cung cấp cho bạn một đoạn javascript để chạy trong bảng điều khiển.

Nếu bạn không có nhiều người dùng như Facebook, thì tôi không nghĩ rằng cần phải làm những gì Facebook đang làm.

Ngay cả khi bạn tắt Javascript trong bảng điều khiển, bạn vẫn có thể chạy javascript qua thanh địa chỉ.

enter image description here

enter image description here

và nếu trình duyệt vô hiệu hóa javascript tại thanh địa chỉ, (Khi bạn dán mã vào thanh địa chỉ trong Google Chrome, nó sẽ xóa cụm từ 'javascript:') dán javascript vào một trong các liên kết qua phần tử kiểm tra vẫn có thể.

Kiểm tra neo:

enter image description here

Dán mã vào href:

enter image description here

enter image description here

enter image description here

Điểm mấu chốt là xác thực phía máy chủ và bảo mật phải là đầu tiên, sau đó thực hiện phía máy khách sau.


18
2017-11-05 00:57



Liên kết "Xem liên kết này" trỏ đến trang rất này. - Dan Dascalescu
Javasctipt có thể ... - Joshua
Tôi đã không nhận thấy rằng cho đến bây giờ @ Joshua cảm ơn! - Jomar Sevillejo


Chrome đã thay đổi rất nhiều kể từ khi facebook có thể vô hiệu hóa giao diện điều khiển ...

Vào tháng 3 năm 2017, tính năng này không hoạt động nữa.

Tốt nhất bạn có thể làm là vô hiệu hóa một số chức năng của bàn điều khiển, ví dụ:

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

5
2018-03-12 12:44





Cách đơn giản của tôi, nhưng nó có thể giúp cho các biến thể hơn nữa về chủ đề này. Liệt kê tất cả các phương pháp và thay đổi chúng thành vô ích.

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

3
2017-11-18 22:29





Đây không phải là biện pháp bảo mật cho mã yếu không được giám sát. Luôn nhận được giải pháp vĩnh viễn cho mã yếu và bảo mật trang web của bạn đúng cách trước khi triển khai chiến lược này

Các công cụ tốt nhất cho đến nay theo kiến ​​thức của tôi sẽ được thêm nhiều tập tin javascript mà chỉ đơn giản là thay đổi tính toàn vẹn của trang trở lại bình thường bằng cách làm mới hoặc thay thế nội dung. Vô hiệu hóa công cụ nhà phát triển này sẽ không phải là ý tưởng lớn nhất vì bỏ qua luôn luôn được đề cập vì mã là một phần của trình duyệt chứ không phải là kết xuất máy chủ, do đó nó có thể bị bẻ khóa.

Bạn có nên có js file one đang kiểm tra để mà <element> thay đổi về các yếu tố quan trọng và js file two và js file three kiểm tra xem tệp này có tồn tại trong một khoảng thời gian bạn sẽ có khôi phục toàn vẹn toàn bộ trên trang trong khoảng thời gian không.

Cho phép lấy một ví dụ về 4 tập tin và cho bạn thấy những gì tôi có ý nghĩa.

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

Bây giờ đây chỉ là để hiển thị nó hoạt động trên tất cả các tệp và thẻ

   #heading {
   background-color:red;
   }

Nếu bạn đặt tất cả các tệp này lại với nhau và tạo ví dụ, bạn sẽ thấy chức năng của biện pháp này. Điều này sẽ ngăn chặn một số tiêm không đáng tin cậy nếu bạn thực hiện nó một cách chính xác trên tất cả các yếu tố quan trọng trong tập tin chỉ mục của bạn đặc biệt là khi làm việc với PHP.

Tại sao tôi chọn tải lại thay vì thay đổi trở lại giá trị bình thường cho mỗi thuộc tính là một thực tế rằng một số kẻ tấn công có thể có một phần khác của trang web đã được cấu hình và sẵn sàng và nó làm giảm số lượng mã. Việc tải lại sẽ loại bỏ tất cả các công việc khó khăn của kẻ tấn công và anh ta có thể sẽ chơi một nơi nào đó dễ dàng hơn.

Một lưu ý khác: Điều này có thể trở thành rất nhiều mã để giữ cho nó sạch sẽ và đảm bảo thêm định nghĩa vào nơi chúng thuộc về việc chỉnh sửa dễ dàng trong tương lai. Đồng thời đặt giây thành số lượng ưa thích của bạn là khoảng thời gian 1 giây trên các trang lớn có thể có tác động mạnh mẽ trên máy tính cũ mà khách truy cập của bạn có thể đang sử dụng


0
2018-03-04 03:16