Javascript.RU

eval

Синтаксис

eval(codeStr)

Аргументы

codeStr
код для выполнения, может использовать переменные и свойства существующих объектов

Описание, примеры

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) // современный вариант
}

Автор: Гость (не зарегистрирован), дата: 12 мая, 2010 - 20:40
#permalink

В современном javascript, как правило, можно воспользоваться другими языковыми средствами вместо eval

А подробней ?


Автор: bullettooth (не зарегистрирован), дата: 21 августа, 2014 - 14:49
#permalink

json2.js и пользуй JSON.parse - для обработки пакета, JSON.stringify - для сериализации


Автор: Shevan, дата: 4 июня, 2010 - 14:46
#permalink

eval может выполнить код полученый аяксом?
И про другие средства хотелось бы услышать ))


Автор: B@rmaley.e><e, дата: 4 июня, 2010 - 19:38
#permalink

Да, можно.

Другие средства зависят от того, для чего Вы используете eval.


Автор: koeshiro, дата: 21 октября, 2013 - 07:52
#permalink

А можно статейку на этот повод? Многим будет полезно знать хоть несколько примеров.


Автор: kibal4iw, дата: 5 августа, 2010 - 11:54
#permalink

Я что-то вообще не понял. Для чего он нужен? Где можно использовать?


Автор: Crusader (не зарегистрирован), дата: 21 сентября, 2010 - 17:36
#permalink

В старых реализациях javascript у eval мог быть второй параметр - объект obj, в контексте которого выполнялся код.
А поподробнее? Что имеется ввиду "контекст" и как это можно использовать?


Автор: blessmaster, дата: 15 февраля, 2011 - 21:37
#permalink

Контекст - это то, что функция видит как this. Аналог экземпляра класса в традиционном ООП.


Автор: Shevan, дата: 30 сентября, 2010 - 23:48
#permalink

В современном javascript, как правило, можно воспользоваться другими языковыми средствами вместо eval.

Можете привести примеры?
Использую для выполнения скриптов полученых АЯКСом


Автор: B@rmaley.e><e, дата: 1 октября, 2010 - 21:00
#permalink

Скриптов или JSON'а? Для второго есть объект с таким же именем.

alert(JSON.parse('{"field":[3,4,5]}').field[1])

Автор: Гость (не зарегистрирован), дата: 16 ноября, 2010 - 13:29
#permalink

К сожалению, для использования в IE6 IE7 такой вариант требует дополнительных телодвижений.


Автор: serega386 (не зарегистрирован), дата: 16 ноября, 2012 - 18:10
#permalink

вот что помогло мне

<meta http-equiv="X-UA-Compatible" content="IE=8" />

Автор: Гость (не зарегистрирован), дата: 10 ноября, 2010 - 13:53
#permalink

вопрос, а как можно использовать eval() для onload function(); ?


Автор: Гость0 (не зарегистрирован), дата: 21 ноября, 2010 - 22:11
#permalink

Можно по подробней, какие именно проблемы с безопасностью могут возникнуть при использовании этой функции?


Автор: B@rmaley.e><e, дата: 21 ноября, 2010 - 23:40
#permalink

Если злоумышленник передаст eval'у некоторый код, то он будет выполнен. А этот код может, например, отправлять куки куда-нибудь или делать еще что-нибудь не очень хорошее.


Автор: Aetae, дата: 22 ноября, 2010 - 01:43
#permalink

Это первое, что приходит на ум по аналогии, но если подумать, то какие-такие куки он сможет куда-то передать использовав eval, не свои ли?))


Автор: B@rmaley.e><e, дата: 22 ноября, 2010 - 15:49
#permalink

Если Вы парсите eval'ом JSON выдачу другого сайта, и этот другой сайт отдаст что-то нехорошее... Угадайте, чьи куки получит злоумышленник.


Автор: Гость (не зарегистрирован), дата: 6 июня, 2012 - 01:20
#permalink

а если, допустим, злоумышленник оставил сообщение в гостевой книге сайта?
тогда все посетители будут передавать свои куки по указанному в коде адресу.


Автор: Merkury, дата: 25 февраля, 2014 - 10:48
#permalink

Куда передаст? Страница и скрипты загружены с хост.нет, как без танцев с бубном на сервере передать данные на левыйхост.да с клиента? Если я не ошибаюсь, даже так вывернуться не получиться:

var img = new Image(); img.src = 'лквыйхост.да/типакартинка.жпг?param = uhaha';

Автор: elser (не зарегистрирован), дата: 30 октября, 2014 - 09:38
#permalink

как передать говорите?

...
ws = new WebSocket('ws://kuda-ugodno.com')
...

так пойдет? ))


Автор: Гость (не зарегистрирован), дата: 14 января, 2011 - 13:59
#permalink

Интересно, а сколько раз можно вызвать eval(eval(...))? Т.е. сколько вложений eval в eval допускается?


Автор: Гость (не зарегистрирован), дата: 7 марта, 2011 - 22:48
#permalink

Как вставить в eval строку с объектом?
Я что то ничего не понял

function = test;
str = function+'(\'Сюда надо вставить объект\')';
eval(str);
//В общем надо выполнит функцию имя которой мне в среде не известно, но при этом надо вставить в нее объект

Автор: Гость (не зарегистрирован), дата: 29 июня, 2012 - 15:05
#permalink

eval может использовать любые объекты, которые были объявлены в программе до его вызова. Иными словами вызов eval где-то в коде эквивалентен тому, что в этом самом месте кода находится код, содержащийся в строке, переданной eval'у.
Более того, любые объекты, созданные в процессе выполнения eval будут доступны в программе после его завершения.
Чтоб было понятней, пример:

var myObj = "Я объект. Я объявлен => существую";
var evalStr = 'function evalFunc(parObj){ \
alert(parObj); \
} \
var evalObj = "Я тоже объект. И я тоже существую, хотя объявлен внутри eval."; \
evalFunc(myObj);';
eval(evalStr);
evalFunc(evalObj );//заметьте функция и объект, созданные внутри eval так же доступны по его завершении и ничем не отличаются от обычных

Автор: Гость (не зарегистрирован), дата: 17 июля, 2013 - 08:40
#permalink

может через конкатенацию?


Автор: dll (не зарегистрирован), дата: 13 марта, 2011 - 05:47
#permalink

var str = "function () { return 'ответ' }";

eval(str); и должно вернуть 'ответ' по идеи


Автор: Гость (не зарегистрирован), дата: 30 марта, 2011 - 17:33
#permalink

var str = "(function () { return 'ответ' })()";
document.write(eval(str)); // ответ


Автор: Chamie (не зарегистрирован), дата: 23 мая, 2011 - 17:47
#permalink

Не подскажете, а почему вот такой код даёт ошибку?
var a = "{b:1,bb:[1,2,3]}";
var d = eval(a);


Автор: Гость (не зарегистрирован), дата: 15 июля, 2011 - 19:11
#permalink

Потому что ты даешь ему просто описание объекта. Это не является законченной конструкцией языка. Должно быть что-то типа:
var d;
............Другой код..............

var a = "d = {b:1,bb:[1,2,3]}";
eval(a);


Автор: Гость (не зарегистрирован), дата: 29 июня, 2012 - 14:34
#permalink

Придумывать лишние переменные совсем необязательно. Достаточно взять JSON код в круглые скобки.

var a = "({b:1,bb:[1,2,3])";
eval(a);

А еще лучше непосредственно в момент вызова eval:

var a = "{b:1,bb:[1,2,3]";
eval('('+a+')');

Лично я написал себе такую функцию:

function parseJSON(parJSON){
			//если переданный параметр - строка (а то мало ли)
			if(typeof parJSON == "string"){
				//начинаем парсит JSON
				return window.JSON && window.JSON.parse ? JSON.parse(parJSON) : eval('('+parJSON+')'); //если браузер поддерживает встроенный JSON, то используем его. Если нет (IE6-7) то используем eval
			}
			return parJSON;
		}

Таким образом добавлять каждый раз скобки вручную не нужно. Заодно используется встроенный JSON, для тех браузеров, которые его поддерживают(а поддерживают его практически все, даже IE начиная с 8-й версии). Как следствие, использование eval сводится к минимуму.
Конечно, пользователи IE6-7 при этом все равно получают дырку в безопасности. Но это уже их проблема. Хотят безопасности, пусть используют нормальный браузер.
Разумеется, в Интернете можно найти массу подобных функций, в которых в придачу еще и обработка кода идет, перед передачей в eval, но возиться с регулярными выражениями ради тех, кто даже нормальный браузер себе установить не хочет это нецелесообразно. Чем чаще у них будут воровать пароли, тем быстрее они задумаются о смене браузера.
Ну и еще одно. JSON строку лучше брать в одинарные кавычки, т.к. двойные используются внутри самого JSON. К тому же строки в одинарных кавычках можно переносить, что удобно для структурирования текста.

alert('Это \
всё \
одна \
строка');

Правда если использовать такой перенос строк в JSON, то я не уверен что он будет корректно восприниматься другими языками программирования. Может потеряться языконезависимость, ведь другие языки используют другие методы для создания многострочных строк. Но в JavaScript это работает номально, не зависимо от браузера и от того, используете ли вы для парсинга eval или JSON.parse().


Автор: Гость (не зарегистрирован), дата: 15 июля, 2011 - 19:11
#permalink

Потому что ты даешь ему просто описание объекта. Это не является законченной конструкцией языка. Должно быть что-то типа:
var d;
............Другой код..............

var a = "d = {b:1,bb:[1,2,3]}";
eval(a);


Автор: Skipp, дата: 11 июля, 2011 - 14:01
#permalink

быстрее в некоторых случаях

eval = function(o){return Function("return " + o)()};

Автор: Increazon, дата: 23 июля, 2011 - 20:45
#permalink

Что возвращает евал? Как ловить ошибку? Я со своего домена ЖРУ аякс, потому испольтзую евал. Про старыне провзеры сказало правильно насчет JSON


Автор: megido (не зарегистрирован), дата: 14 августа, 2011 - 12:34
#permalink

У меня такой вопрос: стоит ли использовать eval в node.js? Если да/нет, то почему? Интересует именно дела, касающиеся безопасности.


Автор: Гость (не зарегистрирован), дата: 21 апреля, 2012 - 17:41
#permalink

Как использование "eval" может навредить сайту?


Автор: Гость (не зарегистрирован), дата: 29 июня, 2012 - 10:15
#permalink

Он может навредить в случае, если вы используете его для выполнения js кода, полученного с чужого ресурса. Например при обработке JSON вам под видом обычного JSON подсунут какой-нибудь вредоносный код. Что именно будет делать этот код это уже дело второе. Но в любом случае, если вы не можете заранее сказать, какой код будет выполняться на вашем сайте, то это уже плохо. Представьте, что кто-то может запросто удалить весь ваш DOM и подсунуть на его место элемент iframe, содержимое которого выглядит в точности как ваша страница, только находится эта страница на совершенно другом сервере и данные, введенные пользователем, использует по-своему. Пользователь даже не заметит ничего. Сайт выглядит так же, адрес вверху тот же, зачем-то просит снова ввести логин и пароль. Ну наверное нужно ввести, раз просит...
Лично я бы посоветовал следующее: считайте eval самым интимным местом своего сайта и не позволяйте незнакомцам ничего туда засовывать. Иначе можно очень неприятно залететь...


Автор: Гость (не зарегистрирован), дата: 4 сентября, 2012 - 15:24
#permalink

спасибо


Автор: CrankOne (не зарегистрирован), дата: 27 октября, 2012 - 23:28
#permalink

Я использую собственный клиентский jison‐generated парсер, производящий JavaScript‐код на стороне клиента из небольшого макродиалекта, код на котором доставляется через AJAX. Здесь сложно представить, как можно обойтись без вызова eval. Это не какой‐нибудь внушительный JSON, к которому легко задать sanity check, это полноценный JavaScript.
И я довольно много времени потратил, исследуя сеть на предмет AJAX‐инъекций. Хотя во многих местах о них упоминается, я не нашёл конкретных примеров. Люди говороят о CSRF, о том, что, по идее, Same Origin Policy должна предохранять от угона запросов, но мне тяжело разобраться во всём сразу. Большинство сообщений о «eval = evil» сводятся к тому что «malicious code» может быть отдан функции eval, но с таким же успехом, может быть изменён любой другой участок контента, и если уж злоумышленник добрался до DOM'а, то он в последнюю очередь будет менять сериализованный javascript. Кажется, двух правил достаточно для того чтобы не бояться использовать eval:

  1. Формировать JavaScript, используя только доверенные источники.
  2. При отправке запросов, пользоваться необходимыми методами защиты от cross-forgery

Если есть что‐то ещё, пожалуйста дополните. Я сравнительно недавно перебрался в web‐программирование, и чувствую себя как бывший сотрудник ИЯФ в ларёчном бизнесе в 90-е.


Автор: Гость (не зарегистрирован), дата: 3 июля, 2013 - 10:22
#permalink

Эх, невежливо вы веб-программирование в туалет макаете. Совершенно напрасно. На вебе есть очень серьезные вещи. Но это отвлечение.
В eval действительно много опасности, но он вполне применим в ряде вещей, иначе бы его давно убрали из языка.
Если кратко, то все опасности заключаются в том, что отдавая eval-у текст, программист практически не проверяет его на валидность. Это опасно не только внедрением вредоносного кода, но и элементарными ошибками ява-скрипта, которые могут завалить страницу в браузере.
То, что написано жестко - обычно более-мнее отлажено. То, что попадает в евал, на практике отладить заметно сложнее.
Поэтому в ряде случаев лучше пользоваться альтернативой (в т.ч. специальными функциями для парсинга JSON).
Что касается пасинга других диалектов на клиенте - то вы, батенька, переаботали в ИЯФ, в вебе принято клиента не нагружать мартышкиным трудом. Да и сервер тоже надо бы поберечь. Принято такие вещи (парсинг, компиляция) производить на разработчицкой машине, а в сеть выкладывать уже преобразованное. Погуглите CofeeScript, чтобы примерно понять.


Автор: alex33, дата: 1 ноября, 2013 - 14:23
#permalink

Короче, Илья,
статья очень маленькая, без разъяснений и неожиданно обрывается, оставив очень много вопросов.
То у вас есть введение, часть 1, часть 2, заключение и всё понятно, а то вот эта статья...


Автор: Гость (не зарегистрирован), дата: 26 марта, 2014 - 21:51
#permalink

Автор: Гость (не зарегистрирован), дата: 22 июля, 2016 - 21:43
#permalink

Всем привет, у меня интересный вопрос, в консоли браузера можно выполнить eval, без всяких проблем, это что тоже уязвимость получается, просто не пойму как можно защитить использование eval?, не делать поле для ввода пользователем вредоносного кода с обработчиком eval, так в можно просто взять и захреначить это в консоли браузера, или консоль браузера это другая история?


 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние темы на форуме
Forum