Какие ключевые слова следует фильтровать в eval ()?

Мне нужно использовать eval () для веб-приложения на основе JavaScript, которое я создаю.

Причина этого в том, что я хочу позволить людям писать свои собственные функции, которые сохраняются в виде текста и могут быть повторно использованы на сайте, когда им нужно будет использовать их в другой раз. Подумайте в духе jsFiddle.

Код будет либо запущен и оценен, либо вставлен как тег скрипта. В любом случае он оставляет сайт открытым для внедрения кода JavaScript злоумышленниками. Таким образом, я планирую либо фильтровать отправленный код, либо, когда пользователь загружает сценарий другого пользователя, выводить предупреждающее сообщение о том, что пользователь должен сначала прочитать / проверить сценарий, прежде чем продолжить.

Пока что я хочу отфильтровать / предупредить по следующим ключевым словам:

eval
execScript

script

window.*
setInterval
setTimeout
alert
confirm
prompt

document.*
write
innerHTML
insertAdjacentHTML
createElement
appendChild
setAttribute

form.*
submit

XMLHttpRequest

jQuery.*
ajax

base64encode
base64decode

Я еще не приступил к тестированию, так что это только мои первые мысли.

У кого-нибудь есть опыт или мнение по этому поводу?

Спасибо, Дэйв


person Dave Stewart    schedule 02.10.2012    source источник
comment
Я не думаю, что jsfiddle использует eval.   -  person canon    schedule 03.10.2012
comment
Фильтровать отправленный код было бы бессмысленно. Люди найдут свой путь по черному списку. Что вы планируете делать, если кто-то использует eval в строковом литерале? Как вы определите, какие строки используются в качестве вывода, а какие используются для обхода вашей песочницы?   -  person cdhowie    schedule 03.10.2012
comment
Здесь могут произойти плохие вещи.   -  person PeeHaa    schedule 03.10.2012
comment
Разрешать пользователям запускать собственный Javascript - плохая идея. Фильтрацию легко преодолеть.   -  person Vivin Paliath    schedule 03.10.2012
comment
Это, сэр, ужасная идея. Подумайте об этом на секунду - self[['a', 'lert'].join('')] ("BOO"); - я только что обошел ваш фильтр. И я могу продолжать делать это, пока вижу ваш код, что, конечно же, поскольку это JS, я могу ..   -  person Stephen    schedule 03.10.2012
comment
Я знаю, что это не решает вашу проблему, но: Избегайте использования eval, используйте: var f = new Function (код вашей функции); f ();   -  person Alcides Queiroz    schedule 03.10.2012
comment
@alcidesqueiroz Как это что-то решает?   -  person cdhowie    schedule 03.10.2012
comment
@cdhowie Согласен, я даю не решение, а подсказку. Eval - не лучшая практика.   -  person Alcides Queiroz    schedule 03.10.2012
comment
@cdhowie: AFAIK new Function создает новую область видимости и не имеет доступа к локальным переменным текущей области, в то время как eval имеет доступ, поэтому new Function кажется более безопасным.   -  person elclanrs    schedule 03.10.2012
comment
@alcidesqueiroz: Хороший пример, вы только что нашли первую дыру в его черном списке - он только предотвращает eval   -  person Bergi    schedule 03.10.2012
comment
@elclanrs Итак? У него по-прежнему будет доступ к window global. new Function() только скроет текущую область видимости, но это предполагает, что настоящая проблема заключается в вещах в текущей области. (Подсказка: это не так.)   -  person cdhowie    schedule 03.10.2012
comment
Что ж, спасибо всем за комментарии; У меня определенно есть направления для изучения.   -  person Dave Stewart    schedule 03.10.2012


Ответы (2)


Практически любую фильтрацию можно обойти, сделав это . Вам нужно будет изолировать Javascript в песочнице. Возможные подходы включают:

person Vivin Paliath    schedule 02.10.2012
comment
На этот пост о песочнице JavaScript есть куча отличных ответов. stackoverflow.com/questions/195149/ Спасибо, вы меня проинформировали :) - person Dave Stewart; 03.10.2012

Невозможно сделать это безопасным - символы []()+!{} могут использоваться для создания любого произвольного кода Javascript.

http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html

Насколько мне известно, jsFiddle работает, выполняя пользовательский код в iframe в другом домене. Он не использует входную фильтрацию.

person Community    schedule 02.10.2012
comment
Ага - я понял это сразу после публикации. - person Dave Stewart; 03.10.2012