Как избежать ошибки переполнения памяти в javascript

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

var userElement = document.getElementById('username');
var passElement = document.getElementById('password');
//sets username, not randomized
var username = 'admin';
//expected characters
var alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')'];
var numOfGuesses = 0; //for fun
var numOfGuessesGenerated = 0; //for fun
var guesses1 = [];
var guesses2 = [];
var guesses3 = [];
var guesses4 = [];
var guesses5 = [];
var guesses6 = [];
var guesses7 = [];
var guesses8 = [];
var guess = "";
var memhandle = 0;

//first for loop is to get all different lengths covered, max being sixteen
var maxNumOfChars = 16;
//generates guesses one character at a time and appends them to array name guesses
for (var y = 0; y < maxNumOfChars; y++) {
    for (var i = 0; i < alphabet.length; i++) {
    while (i < maxNumOfChars) {
            guess+=alphabet[i];
    }
    }
    if (memhandle == 0) {
        guesses1.push(guess);
        memhandle = 1
    } else if (memhandle == 1) {
        guesses2.push(guess);
        memhandle = 2;
    } else if (memhandle == 2) {
        guesses3.push(guess);
        memhandle = 3;
    } else if (memhandle == 3) {
        guesses4.push(guess);
        memhandle = 4;
    } else if (memhandle == 4) {
        guesses5.push(guess);
        memhandle = 5;
    } else if (memhandle == 5) {
        guesses6.push(guess);
        memhandle = 6;
    } else if (memhandle == 6) {
        guesses7.push(guess);
        memhandle = 7;
    } else if (memhandle == 7) {
        guesses8.push(guess);
        memhandle = 0;
    } 


    numOfGuessesesGenerated++;
    guess = "";
}

numOfGuessesesGenerated++;
console.info(numOfGuessesesGenerated);
console.info(guesses);

//try the guesses!
for (var x = 0; x < guesses.length; x++) {
    userElement.value = username;
    passElement.value = guesses[x];
    numOfGuesses++;
    console.info(numOfGuesses);
    document.getElementById("myForm").submit(); //myForm IS the name of the form
}   



document.getElementById("fid").submit();  

Причина, по которой я включил переменную memhandle, заключалась в том, чтобы попытаться разделить все предположения на разные массивы, и именно поэтому у меня так много массивов. Страница постоянно вылетает всякий раз, когда я пытаюсь это сделать, есть ли способ сделать это только с помощью javascript, или мне нужно где-то хранить имена пользователей, а затем извлекать их оттуда? Я ввожу javascript, просто вводя javascript: в строке URL, и это также может быть причиной моих проблем. Любая помощь приветствуется

Как вы думаете, почему разделение элементов на 8 отдельных массивов вообще сократит объем памяти?

ugh StackExchange 20.10.2018 21:35

Зачем вообще хранить догадки? Просто создайте предположение, проверьте его, а затем выбросьте. Увеличивайте свои счетчики и переходите к следующему.

Ken 20.10.2018 21:37

Прочтите свой сценарий и подумайте, как будто вы компьютер: поместите себя во второй цикл for (где вы увеличиваете i). Допустим, мы находимся на первой итерации (i === 0). Мы проходим цикл while и повторяем его до i < 16. Первая итерация цикла while: мы добавляем a к нашему предположению. Должны ли мы сделать еще одну итерацию этого цикла while? Да, i по-прежнему остается 0. К нашей догадке добавляем a. Должны ли мы сделать еще одну итерацию этого цикла while? Да, i по-прежнему остается 0. Должны ли мы сделать еще одну итерацию этого цикла while? Да, i по-прежнему остается 0. Мы добавляем a к нашим догадкам .. Вы уловили суть.

blex 20.10.2018 21:45

@FrankerZ Я подумал, может быть, есть ограничение на размер, который может быть

dbredred 20.10.2018 22:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема, с которой вы столкнулись, - это while (i < maxNumOfChars) {. Этот цикл никогда не завершится. Вы делаете guess+=alphabet[i];, но не увеличиваете i вообще (внутри этого цикла), поэтому в конечном итоге происходит сбой.

Могу ли я порекомендовать посмотреть на функции итератора, чтобы вообще избежать массива?

var userElement = document.getElementById('username');
var passElement = document.getElementById('password');
//sets username, not randomized
var username = 'admin';
//expected characters
var alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')'];
var numOfGuesses = 0; //for fun
var numOfGuessesGenerated = 0; //for fun
var guess = "";
var memhandle = 0;

//first for loop is to get all different lengths covered, max being sixteen
var maxNumOfChars = 16;
//generates guesses one character at a time and appends them to array name guesses
function *getNextGuess() {
  for (var y = 0; y < maxNumOfChars; y++) {
      for (var i = 0; i < alphabet.length; i++) {
        //while (i < maxNumOfChars) {
              guess+=alphabet[i];
        //}
      }
      yield guess;
  }
}

//try the guesses!
for (var guess of getNextGuess()) {
  console.info(guess);
  numOfGuesses++;
  console.info(numOfGuesses);
  
  if (numOfGuesses > 10)
    break;
}   



//document.getElementById("fid").submit();  

Другие вопросы по теме