Или есть другие способы оценки кода
Вы не можете отфильтровать вызовы к eval()
на уровне синтаксического анализа, потому что JavaScript - это полный по Тьюрингу язык, на котором можно запутывать вызовы. например. увидеть обходной путь Свинто. Вы можете скрыть window.eval
, перезаписав его нулевым значением, но на самом деле есть другие способы оценки кода, в том числе (чуть выше моей головы):
- новая функция ('code') ()
- document.write ( '% 3Cscript> код% 3C / скрипт>')
- document.createElement ( 'сценарий'). AppendChild (document.createTextNode ( 'код'))
- window.setTimeout ('code', 0);
- window.open (...). Eval ( 'код')
- location.href = 'JavaScript: код'
- в IE, style / node.setExpression ('someproperty', 'code')
- в некоторых браузерах, node.onsomeevent = 'code';
- в старых браузерах, Object.prototype.eval ('code')
или вызвать массовую панику в javascript?
Хорошо, createElement ('iframe'). Src = 'http: //evil.iframeexploitz.ru/aff=2345' - это одна из худших атак, которые вы можете ожидать ... но на самом деле, когда скрипт имеет контроль, он может делать все, что может пользователь на вашем сайте. Это может заставить их публиковать «Я большой старый педофил!» Тысячу раз на ваших форумах, а затем удалять свою учетную запись. Например.
Должен ли я прибегнуть к требованию автора предоставить интерфейс веб-службы?
Да или:
- ничего не делать и разрешить пользователям, желающим эту функцию, загрузить GreaseMonkey
- Проверяйте каждый сценарий самостоятельно
- используйте свой собственный (потенциально JavaScript-подобный) мини-язык, над которым вы фактически владеете
пример последнего, который может вас заинтересовать: Google Caja . Я не совсем уверен, что доверю этому; это тяжелая работа, и у них наверняка были некоторые дыры в безопасности, но это лучшее из того, что есть, если вы действительно должны использовать этот подход.