1. Telegram чат для обсуждения работы JS парсеров и Node.js модулей: https://t.me/a_parser_javascript
  2. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

Отключения strict mode

Тема в разделе "Техническая поддержка по JavaScript парсерам", создана пользователем autoparts.db, 14 май 2018.

Метки:
  1. autoparts.db

    autoparts.db A-Parser Pro License
    A-Parser Pro

    Регистрация:
    17 мар 2018
    Сообщения:
    37
    Симпатии:
    12
    Доброго времени суток.

    В своем Javascript парсере, я выполняю(через eval) сильно обфусцированный javascript код полученный из html страницы с которой парсю информацию.

    Этот код предназначен для выполнения в браузере, так вот если откинуть проблему в DOM, которую я уже решил(с помощью модуля jsdom для node.js), остаются проблемы с использования не инициализированных переменных, c octal literals и другими вещами, которые разрешены в браузере.

    Было бы не плохо иметь возможность отключить strict mode, V8 имеет возможность отключения strict mode. К примеру nodejs компилируется без жестко включенного strict mode. Также некоторые модули node.js используют octal literals и не смогут работать с Javascript парсером жестко использующим strict mode везде.

    Если есть возможность сейчас отключить strict mode в Javascript парсере, подскажите пожалуйста как? А то уже надоело получать сообщения вида "Octal escape sequences are not allowed in strict mode".
     
    #1 autoparts.db, 14 май 2018
    Последнее редактирование: 14 май 2018
  2. Forbidden

    Forbidden Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    9 мар 2013
    Сообщения:
    3.337
    Симпатии:
    1.795
    можно минимальный тесткейс по этой проблеме?
     
  3. autoparts.db

    autoparts.db A-Parser Pro License
    A-Parser Pro

    Регистрация:
    17 мар 2018
    Сообщения:
    37
    Симпатии:
    12
    Ну вот к примеру javascript код:

    который может быть в html и который без проблем выполняется в node.js( без 'use strict'; ) и браузере:

    [​IMG]

    Вот фактически тот же самый код в Javascript парсере:

    и он выдает ошибку:

    [​IMG]

    [​IMG]

    Потому что Вы скомпилировали V8 с жестко включенным strict mode флагом, насколько я понял.

    В командной строке движка V8 есть флаг --use_strict, который принудительно включает strict mode везде, по все видимости Вы так и сделали.
     
  4. johnsmith

    johnsmith A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    13 мар 2013
    Сообщения:
    63
    Симпатии:
    31
    офф: добавьте на форум подсветку и форматирование js кода :)
     
  5. Forbidden

    Forbidden Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    9 мар 2013
    Сообщения:
    3.337
    Симпатии:
    1.795
    Судя по документации легко сделать eval без strict mode:
    Код:
    let code = `hello_world = "hello_world";
    console.log(hello_world);
    03;`;
    const eval_nostrict = eval;
    this.logger.put(eval_nostrict(code));
    
     
  6. autoparts.db

    autoparts.db A-Parser Pro License
    A-Parser Pro

    Регистрация:
    17 мар 2018
    Сообщения:
    37
    Симпатии:
    12
    Да, я уже пробывал так, но проблема в том, что тогда код, который евалится в strict mode, не видит локально глобальных переменных созданных вне eval:

    Даже если, я например объявлю локальную переменную через eval_nostrict(), мне придется евалить все тело функции, поскольку в ней много связанных локально глобальных переменных, и я не уверен что код в eval увидит this.request и т.п.(я не проверял).

    Давайте я объясню зачем мне это в деталях.

    Я столкнулся с защитой от сети F5 Networks, которая прежде чем пустить пользователя на страницу, использует javascript для установки cookie.

    Для обхода этой защиты, я получаю первоначальную страницу с javascript который устанавливает защитные cookie, выполняю его через eval, предварительно создав локально глобальные переменные window,document,navigator, который присутствуют в браузере, но не в node.js или V8.

    Для эмуляции DOM дерева, которое использует и проверяет скрипт защиты, я использую jsdom модуль для node.js.

    И в принципе мне удалось обойти защиту F5 Networks от парсинга таким образом, но как описал ранее, браузерный javascript может не соблюдать правила strict mode.
     
    #6 autoparts.db, 16 май 2018
    Последнее редактирование: 16 май 2018
  7. Forbidden

    Forbidden Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    9 мар 2013
    Сообщения:
    3.337
    Симпатии:
    1.795
    Получается 2 разных контекста для strict и nostrict режима, интересная задачка, вот мое решение:
    Код:
    let code = 'outside.key';
    const eval_nostrict = eval;
    const setGlobal = eval_nostrict(`
        (function(varName, value) {
            const func = eval(\`(function(value) { \${varName} = value })\`);
            func(value);
        })
    `);
    setGlobal('outside', {key: 42});
    this.logger.put(eval_nostrict(code));
    
    установка произвольных глобальных объектов внутри nostrict контекста

    P.S. подкиньте примеров сайтов с F5 Networks защитой, мы встроим обход в парсер
     
    Metroid, autoparts.db и Vvtex нравится это.
  8. autoparts.db

    autoparts.db A-Parser Pro License
    A-Parser Pro

    Регистрация:
    17 мар 2018
    Сообщения:
    37
    Симпатии:
    12
    Хорошо, спасибо, я попробую.

    Было бы хорошо, но у них там много модулей защиты - и с капчей, и без.
    Отправил Вам в ПМ несколько примеров.
     

Поделиться этой страницей