В настоящее время я работаю с V8 в среде C++. Я делаю серверную клиентскую систему, чтобы люди могли отправлять JS на сервер и запускать ее на сервере. Он работает так, как ожидалось, но у меня есть рассол, выясняющий, как создать среду песочницы. Я пытаюсь избегать просто имен функций черного списка из кода клиента.V8 Публикация классов, но ограничение этого кода
Структуры Я иду на два типа файлов:
JS Библиотека Файлы: Используется для записи JS библиотек для использования в песочнице. Имеет доступ к классам C++, которые были открыты для V8. Функции, определенные в этом файле, будут доступны для клиентов.
Песочница: Это позволит получить доступ к функциям, определенным в файлах библиотеки JS, но не будет иметь доступа к классам C++, которые были открыты для V8.
Это позволит администраторам системы писать файлы библиотеки JS с использованием EXTREMELY мощных открытых классов C++, но ограничивает их использование только функциями, определенными в файлах lib, и тем, что они сами определяют.
Если это не совсем понятно, вот пример сценария:
JS Library File (isInNationLib.js):
function isInAmerica(clientName) {
var ip = ipByClientName(clientName);
//use the ip to find if the client is in America
}
Client File:
#include "isInNationLib"
function getNationality(clientName) {
if (isInAmerica(clientName)) {
return "American";
}
etc...
}
С пример выше, клиент не должен иметь доступ к ipByClientName по соображениям безопасности. ipByClientName будет функцией C++, открытой для V8. Этот конкретный пример не будет в моем проекте, но он демонстрирует аспекты безопасности проблемы.
В черном списке вы подразумеваете поиск кода клиента для фактической строки, представляющей незаконную функцию, и отклонения? Я., это не сработает. – Yakk
Я знаю, но я не могу придумать другого способа сделать это. –
Белый список. Заменить вызовы в разрешенном коде с уникальным уникальным именем crypto? Поражение требует враждебного кода, чтобы получить вызов источника или кого-то другого или перечислить точки входа или что-то подобное. – Yakk