a = "alert(1)"
eval(a)
Метод eval возвращает значение последнего вычисленного выражения.
var str = "if (a) { 1+1 } else { 1+2 }"
var a = true
var b = eval(str)
alert("b равно : " + b) // 2
// теперь поменяем "a"
a = false
b = eval(str)
alert("b равно : " + b) // 3
Если аргумент eval
- не строка, то возвращается аргумент без изменения:
r = new RegExp('a')
r == eval(r) // true
Можно обойти это прямым вызовом toString
:
function forceEval(obj) {
return eval(obj.toString())
}
Не используйте eval
Выполнение кода в eval может быть небезопасно. При таком выполнении затруднена отладка. В современном javascript, как правило, можно воспользоваться другими языковыми средствами вместо eval
.
eval для JSON
Как правило, eval
используют для разбора формата JSON.
var = eval('('+json+')')
Такой способ небезопасен, но наиболее быстр.
Второй параметр
В старых реализациях javascript у eval
мог быть второй параметр - объект obj
, в контексте которого выполнялся код.
В современном javascript для этого используется with
:
eval(code, obj) // старый вариант
with(obj) {
eval(code) // современный вариант
}
А подробней ?
json2.js и пользуй JSON.parse - для обработки пакета, JSON.stringify - для сериализации
eval может выполнить код полученый аяксом?
И про другие средства хотелось бы услышать ))
Да, можно.
Другие средства зависят от того, для чего Вы используете eval.
А можно статейку на этот повод? Многим будет полезно знать хоть несколько примеров.
Я что-то вообще не понял. Для чего он нужен? Где можно использовать?
В старых реализациях javascript у eval мог быть второй параметр - объект obj, в контексте которого выполнялся код.
А поподробнее? Что имеется ввиду "контекст" и как это можно использовать?
Контекст - это то, что функция видит как this. Аналог экземпляра класса в традиционном ООП.
Можете привести примеры?
Использую для выполнения скриптов полученых АЯКСом
Скриптов или JSON'а? Для второго есть объект с таким же именем.
К сожалению, для использования в IE6 IE7 такой вариант требует дополнительных телодвижений.
вот что помогло мне
вопрос, а как можно использовать eval() для onload function(); ?
Можно по подробней, какие именно проблемы с безопасностью могут возникнуть при использовании этой функции?
Если злоумышленник передаст eval'у некоторый код, то он будет выполнен. А этот код может, например, отправлять куки куда-нибудь или делать еще что-нибудь не очень хорошее.
Это первое, что приходит на ум по аналогии, но если подумать, то какие-такие куки он сможет куда-то передать использовав eval, не свои ли?))
Если Вы парсите eval'ом JSON выдачу другого сайта, и этот другой сайт отдаст что-то нехорошее... Угадайте, чьи куки получит злоумышленник.
а если, допустим, злоумышленник оставил сообщение в гостевой книге сайта?
тогда все посетители будут передавать свои куки по указанному в коде адресу.
Куда передаст? Страница и скрипты загружены с хост.нет, как без танцев с бубном на сервере передать данные на левыйхост.да с клиента? Если я не ошибаюсь, даже так вывернуться не получиться:
как передать говорите?
так пойдет? ))
Интересно, а сколько раз можно вызвать eval(eval(...))? Т.е. сколько вложений eval в eval допускается?
Как вставить в eval строку с объектом?
Я что то ничего не понял
eval может использовать любые объекты, которые были объявлены в программе до его вызова. Иными словами вызов eval где-то в коде эквивалентен тому, что в этом самом месте кода находится код, содержащийся в строке, переданной eval'у.
Более того, любые объекты, созданные в процессе выполнения eval будут доступны в программе после его завершения.
Чтоб было понятней, пример:
может через конкатенацию?
var str = "function () { return 'ответ' }";
eval(str); и должно вернуть 'ответ' по идеи
var str = "(function () { return 'ответ' })()";
document.write(eval(str)); // ответ
Не подскажете, а почему вот такой код даёт ошибку?
var a = "{b:1,bb:[1,2,3]}";
var d = eval(a);
Потому что ты даешь ему просто описание объекта. Это не является законченной конструкцией языка. Должно быть что-то типа:
var d;
............Другой код..............
var a = "d = {b:1,bb:[1,2,3]}";
eval(a);
Придумывать лишние переменные совсем необязательно. Достаточно взять JSON код в круглые скобки.
А еще лучше непосредственно в момент вызова eval:
Лично я написал себе такую функцию:
Таким образом добавлять каждый раз скобки вручную не нужно. Заодно используется встроенный JSON, для тех браузеров, которые его поддерживают(а поддерживают его практически все, даже IE начиная с 8-й версии). Как следствие, использование eval сводится к минимуму.
Конечно, пользователи IE6-7 при этом все равно получают дырку в безопасности. Но это уже их проблема. Хотят безопасности, пусть используют нормальный браузер.
Разумеется, в Интернете можно найти массу подобных функций, в которых в придачу еще и обработка кода идет, перед передачей в eval, но возиться с регулярными выражениями ради тех, кто даже нормальный браузер себе установить не хочет это нецелесообразно. Чем чаще у них будут воровать пароли, тем быстрее они задумаются о смене браузера.
Ну и еще одно. JSON строку лучше брать в одинарные кавычки, т.к. двойные используются внутри самого JSON. К тому же строки в одинарных кавычках можно переносить, что удобно для структурирования текста.
Правда если использовать такой перенос строк в JSON, то я не уверен что он будет корректно восприниматься другими языками программирования. Может потеряться языконезависимость, ведь другие языки используют другие методы для создания многострочных строк. Но в JavaScript это работает номально, не зависимо от браузера и от того, используете ли вы для парсинга eval или JSON.parse().
Потому что ты даешь ему просто описание объекта. Это не является законченной конструкцией языка. Должно быть что-то типа:
var d;
............Другой код..............
var a = "d = {b:1,bb:[1,2,3]}";
eval(a);
быстрее в некоторых случаях
Что возвращает евал? Как ловить ошибку? Я со своего домена ЖРУ аякс, потому испольтзую евал. Про старыне провзеры сказало правильно насчет JSON
У меня такой вопрос: стоит ли использовать eval в node.js? Если да/нет, то почему? Интересует именно дела, касающиеся безопасности.
Как использование "eval" может навредить сайту?
Он может навредить в случае, если вы используете его для выполнения js кода, полученного с чужого ресурса. Например при обработке JSON вам под видом обычного JSON подсунут какой-нибудь вредоносный код. Что именно будет делать этот код это уже дело второе. Но в любом случае, если вы не можете заранее сказать, какой код будет выполняться на вашем сайте, то это уже плохо. Представьте, что кто-то может запросто удалить весь ваш DOM и подсунуть на его место элемент iframe, содержимое которого выглядит в точности как ваша страница, только находится эта страница на совершенно другом сервере и данные, введенные пользователем, использует по-своему. Пользователь даже не заметит ничего. Сайт выглядит так же, адрес вверху тот же, зачем-то просит снова ввести логин и пароль. Ну наверное нужно ввести, раз просит...
Лично я бы посоветовал следующее: считайте eval самым интимным местом своего сайта и не позволяйте незнакомцам ничего туда засовывать. Иначе можно очень неприятно залететь...
спасибо
Я использую собственный клиентский jison‐generated парсер, производящий JavaScript‐код на стороне клиента из небольшого макродиалекта, код на котором доставляется через AJAX. Здесь сложно представить, как можно обойтись без вызова eval. Это не какой‐нибудь внушительный JSON, к которому легко задать sanity check, это полноценный JavaScript.
И я довольно много времени потратил, исследуя сеть на предмет AJAX‐инъекций. Хотя во многих местах о них упоминается, я не нашёл конкретных примеров. Люди говороят о CSRF, о том, что, по идее, Same Origin Policy должна предохранять от угона запросов, но мне тяжело разобраться во всём сразу. Большинство сообщений о «eval = evil» сводятся к тому что «malicious code» может быть отдан функции eval, но с таким же успехом, может быть изменён любой другой участок контента, и если уж злоумышленник добрался до DOM'а, то он в последнюю очередь будет менять сериализованный javascript. Кажется, двух правил достаточно для того чтобы не бояться использовать eval:
Если есть что‐то ещё, пожалуйста дополните. Я сравнительно недавно перебрался в web‐программирование, и чувствую себя как бывший сотрудник ИЯФ в ларёчном бизнесе в 90-е.
Эх, невежливо вы веб-программирование в туалет макаете. Совершенно напрасно. На вебе есть очень серьезные вещи. Но это отвлечение.
В eval действительно много опасности, но он вполне применим в ряде вещей, иначе бы его давно убрали из языка.
Если кратко, то все опасности заключаются в том, что отдавая eval-у текст, программист практически не проверяет его на валидность. Это опасно не только внедрением вредоносного кода, но и элементарными ошибками ява-скрипта, которые могут завалить страницу в браузере.
То, что написано жестко - обычно более-мнее отлажено. То, что попадает в евал, на практике отладить заметно сложнее.
Поэтому в ряде случаев лучше пользоваться альтернативой (в т.ч. специальными функциями для парсинга JSON).
Что касается пасинга других диалектов на клиенте - то вы, батенька, переаботали в ИЯФ, в вебе принято клиента не нагружать мартышкиным трудом. Да и сервер тоже надо бы поберечь. Принято такие вещи (парсинг, компиляция) производить на разработчицкой машине, а в сеть выкладывать уже преобразованное. Погуглите CofeeScript, чтобы примерно понять.
Короче, Илья,
статья очень маленькая, без разъяснений и неожиданно обрывается, оставив очень много вопросов.
То у вас есть введение, часть 1, часть 2, заключение и всё понятно, а то вот эта статья...
а как работает Eval(), никак не пойму? и в чем смысл если есть другие парсери
Всем привет, у меня интересный вопрос, в консоли браузера можно выполнить eval, без всяких проблем, это что тоже уязвимость получается, просто не пойму как можно защитить использование eval?, не делать поле для ввода пользователем вредоносного кода с обработчиком eval, так в можно просто взять и захреначить это в консоли браузера, или консоль браузера это другая история?