Я делал (не сейчас, но все же мне интересно об этом) игру с использованием HTML5 и JS, и я хотел, чтобы люди могли вставлять собственные сценарии, но безопасные.
function executeCustomJS(code){
eval(code);//bad
}
Конечно, этот код очень плохой, потому что если код похож на document.location.href='http://meatspn.com'
, то результат станет очень ... (...)
Одно решение, которое я нашел, это экранирование (например, eval
-> ___eval___
) всех ключевых слов и непереключение ключевых слов в белом списке, таких как 'while', 'for', 'if', 'var', ' true ',' false ', ... и' func0 ',' func1 ', ...., которые являются чем-то (например, API) игры и являются безопасными.
Например,
function executeCustomJS(code){
code = code.replace(/(Keyword RegEx)/g,'___$1___');
/*unescape keywords in whitelist*/
eval(code);
}
Я не сделал RegEx и все остальное в комментариях, но это не вопрос.
Давайте предположим, что строки в коде не экранированы, нет функции, которая может быть выполнена путем экранирования строки, и 'eval', 'window', 'document', 'alert', 'location' НЕ находятся в белом списке. Тем не менее, некоторые люди могут выполнять код, подобный while(true){}
, они не могут выполнять код, подобный document.location.href='http://meatspn.com'
.
Безопасен ли этот метод? Или лучший способ существует или нет?