Мы хотим предоставить нашим пользователям возможность выполнять самостоятельно созданный код JavaScript в нашем приложении. Для этого нам нужно использовать eval
для оценки кода. Чтобы уменьшить все проблемы безопасности до минимума (если не ноль), наша идея состоит в том, чтобы предотвратить использование какой-либо функции window
или document
в коде. Так что нет XMLHttpRequest
или чего-то подобного.
Это код:
function secure_eval(s) {
var ret;
(function(){
var copyXMLHttpRequest = XMLHttpRequest; // save orginal function in copy
XMLHttpRequest = undefined; // make orignal function unavailable
(function() {
var copyXMLHttpRequest; // prevent access to copy
try {
ret = eval(s)
} catch(e) {
console.log("syntax error or illegal function used");
}
}())
XMLHttpRequest = copyXMLHttpRequest; // restore original function
}())
return ret;
}
Это работает следующим образом:
secure_eval('new XMLHttpRequest()'); // ==> "illegal function used"
Теперь у меня есть несколько вопросов:
- Является ли этот шаблон правильным способом для обеспечения безопасности
eval
? - Какие функции
window
иdocument
являются теми, которые считаются вредными? - Чтобы отправить вопрос 2. Я попытался замаскировать все (родные) функции
window
Но я не могу их перечислить:
Здесь не отображается XMLHttpRequest
:
for( var x in window) {
if( window[x] instanceof Function) {
console.log(x);
}
}
Есть ли способ получить список всех нативных функций window
и document
?
EDIT:
Одна из моих идей - выполнить eval
внутри Worker
и предотвратить доступ к XMLHttpRequest
и document.createElement
(см. мое решение выше). Это имело бы (на мой взгляд) следующие последствия:
- нет доступа к оригиналу
document
- нет доступа к оригиналу
window
- нет возможности связываться с внешними ресурсами (без аякса, без скриптов)
Вы видите какие-либо недостатки или утечки здесь?
EDIT2:
Тем временем я нашел этот вопрос, ответ на который решает многие из моих проблем, а также пару вещей, о которых я даже не думал (т.е. блокировка браузера с "while(true){}"
.