2016-10-26 11 views
1

В настоящее время я работаю с 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. Этот конкретный пример не будет в моем проекте, но он демонстрирует аспекты безопасности проблемы.

+0

В черном списке вы подразумеваете поиск кода клиента для фактической строки, представляющей незаконную функцию, и отклонения? Я., это не сработает. – Yakk

+0

Я знаю, но я не могу придумать другого способа сделать это. –

+0

Белый список. Заменить вызовы в разрешенном коде с уникальным уникальным именем crypto? Поражение требует враждебного кода, чтобы получить вызов источника или кого-то другого или перечислить точки входа или что-то подобное. – Yakk

ответ

0

При создании контекста вы указываете, что добавляется в этот контекст - либо путем установки его в ObjectTemplate при создании контекста, либо путем вызова Set на глобальном объекте контекста впоследствии.

Сделайте два contexts, где доступ к ограниченному материалу доступен, и тот, где он отсутствует, и направьте входящий javascript в соответствующий контекст на основе любых механизмов авторизации, которые у вас есть.