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

autoparts.db

A-Parser Pro License
A-Parser Pro
Доброго времени суток.

В своем 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".
 
Последнее редактирование:
можно минимальный тесткейс по этой проблеме?
 
можно минимальный тесткейс по этой проблеме?
Ну вот к примеру javascript код:

hello_world = "hello_world";
console.log(hello_world);
console.log(03);

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



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

class Parser {
constructor() {
this.defaultConf = {
version: '0.1.15',
results: {
flat: [
['source', 'HTML title'],
]
},
results_format: '$query: $title\\n',
parsecodes: {
200: 1,
},
max_size: 200 * 1024,
};
}

*parse(set, results)
{
hello_world = "hello_world";
this.logger.put(hello_world);
this.logger.put(03);

results.success = response.success;

return results;
}
}

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





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

В командной строке движка V8 есть флаг --use_strict, который принудительно включает strict mode везде, по все видимости Вы так и сделали.
 
офф: добавьте на форум подсветку и форматирование js кода :)
 
Судя по документации легко сделать eval без strict mode:
Код:
let code = `hello_world = "hello_world";
console.log(hello_world);
03;`;
const eval_nostrict = eval;
this.logger.put(eval_nostrict(code));
 
Да, я уже пробывал так, но проблема в том, что тогда код, который евалится в strict mode, не видит локально глобальных переменных созданных вне eval:

var window = 'ddd';
let code = `hello_world = "hello_world";
console.log(hello_world);
console.log(window);
03;`;
const eval_nostrict = eval;
console.log(eval_nostrict(code));

Даже если, я например объявлю локальную переменную через 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.
 
Последнее редактирование:
Получается 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 защитой, мы встроим обход в парсер
 
Хорошо, спасибо, я попробую.

P.S. подкиньте примеров сайтов с F5 Networks защитой, мы встроим обход в парсер

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