Помимо методов преобразования текста в код, таких как eval
/ Function
, или добавления дополнительных сценариев, существуют ли еще способы скрыть лексическую область видимости, которая аннулирует базовый c лексический поиск для объявления идентификатора и все ссылки?
Это связано, например, с «переименованием» vs-кода (по умолчанию F2), точнее, с реализацией аналогичной функциональности. Другими словами, локальное наблюдение за фрагментом из более крупной программы и переименование идентификатора - не в обычной ситуации «наилучшей практики», а в том, что обфускатор намеренно пытается саботировать вас.
Пример проблемного c случай с eval
будет следующим:
function f() {
try { v; } catch(_) { console.log("weewoo"); }
}
{
let v = 1;
function g() {
v; // entering here, trying to rename this "v"
}
eval(`(${f.toString()})()`);
}
В vs-коде переименование помеченного v
семантически изменит код, который может быть обнаружен.
Если есть eval
/ Function
не должно использоваться во всем коде, и несомненно, что никакой дополнительный код не загружается, всегда ли лексическое переименование безопасно? Есть ли еще такие подводные камни?
Редактировать: Есть два других случая, которые я забыл упомянуть, потому что они, как правило, не применяются, и их гораздо легче обнаружить. Однако они все еще очень связаны:
, используя тот факт, что глобальные переменные области видимости добавляются в глобальный объект:
var v = 1;
v; // renaming here
if (!window[String.fromCharCode(118)])
console.log("weewoo");
устаревший оператор строгого режима with
(который vs-code обнаруживает!):
var v = 0;
with({ v: 1 }) {
v; // renaming here
if (!v) console.log("weewoo");
}