eval
Метод 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 :
Не используйте eval
Выполнение кода в eval может быть небезопасно. При таком выполнении затруднена отладка. В современном javascript, как правило, можно воспользоваться другими языковыми средствами вместо eval .
eval для JSON
Как правило, eval используют для разбора формата JSON.
Такой способ небезопасен, но наиболее быстр.
Второй параметр
В старых реализациях javascript у eval мог быть второй параметр — объект obj , в контексте которого выполнялся код.
В современном javascript для этого используется with :
eval(code, obj) // старый вариант with(obj) < eval(code) // современный вариант >
В современном javascript, как правило, можно воспользоваться другими языковыми средствами вместо eval
json2.js и пользуй JSON.parse — для обработки пакета, JSON.stringify — для сериализации
eval может выполнить код полученый аяксом?
И про другие средства хотелось бы услышать ))
Другие средства зависят от того, для чего Вы используете eval.
А можно статейку на этот повод? Многим будет полезно знать хоть несколько примеров.
Я что-то вообще не понял. Для чего он нужен? Где можно использовать?
В старых реализациях javascript у eval мог быть второй параметр — объект obj, в контексте которого выполнялся код.
А поподробнее? Что имеется ввиду «контекст» и как это можно использовать?
Контекст — это то, что функция видит как this. Аналог экземпляра класса в традиционном ООП.
В современном javascript, как правило, можно воспользоваться другими языковыми средствами вместо eval.
Можете привести примеры?
Использую для выполнения скриптов полученых АЯКСом
Скриптов или JSON’а? Для второго есть объект с таким же именем.
К сожалению, для использования в IE6 IE7 такой вариант требует дополнительных телодвижений.
вопрос, а как можно использовать eval() для onload function(); ?
Можно по подробней, какие именно проблемы с безопасностью могут возникнуть при использовании этой функции?
Если злоумышленник передаст eval’у некоторый код, то он будет выполнен. А этот код может, например, отправлять куки куда-нибудь или делать еще что-нибудь не очень хорошее.
Это первое, что приходит на ум по аналогии, но если подумать, то какие-такие куки он сможет куда-то передать использовав eval, не свои ли?))
Если Вы парсите eval’ом JSON выдачу другого сайта, и этот другой сайт отдаст что-то нехорошее. Угадайте, чьи куки получит злоумышленник.
а если, допустим, злоумышленник оставил сообщение в гостевой книге сайта?
тогда все посетители будут передавать свои куки по указанному в коде адресу.
Куда передаст? Страница и скрипты загружены с хост.нет, как без танцев с бубном на сервере передать данные на левыйхост.да с клиента? Если я не ошибаюсь, даже так вывернуться не получиться:
var img = new Image(); img.src = 'лквыйхост.да/типакартинка.жпг?param = uhaha';
. ws = new WebSocket('ws://kuda-ugodno.com') .
Интересно, а сколько раз можно вызвать eval(eval(. ))? Т.е. сколько вложений eval в eval допускается?
Как вставить в eval строку с объектом?
Я что то ничего не понял
function = test; str = function+'(\'Сюда надо вставить объект\')'; eval(str); //В общем надо выполнит функцию имя которой мне в среде не известно, но при этом надо вставить в нее объект
eval может использовать любые объекты, которые были объявлены в программе до его вызова. Иными словами вызов eval где-то в коде эквивалентен тому, что в этом самом месте кода находится код, содержащийся в строке, переданной eval’у.
Более того, любые объекты, созданные в процессе выполнения eval будут доступны в программе после его завершения.
Чтоб было понятней, пример:
var myObj = "Я объект. Я объявлен => существую"; var evalStr = 'function evalFunc(parObj) < \ alert(parObj); \ >\ var evalObj = "Я тоже объект. И я тоже существую, хотя объявлен внутри eval."; \ evalFunc(myObj);'; eval(evalStr); evalFunc(evalObj );//заметьте функция и объект, созданные внутри eval так же доступны по его завершении и ничем не отличаются от обычных
eval(str); и должно вернуть ‘ответ’ по идеи
var str = «(function () < return 'ответ' >)()»;
document.write(eval(str)); // ответ
Не подскажете, а почему вот такой код даёт ошибку?
var a = «»;
var d = eval(a);
Потому что ты даешь ему просто описание объекта. Это не является законченной конструкцией языка. Должно быть что-то типа:
var d;
. Другой код.
Придумывать лишние переменные совсем необязательно. Достаточно взять JSON код в круглые скобки.
А еще лучше непосредственно в момент вызова eval:
Лично я написал себе такую функцию:
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().
Потому что ты даешь ему просто описание объекта. Это не является законченной конструкцией языка. Должно быть что-то типа:
var d;
. Другой код.
быстрее в некоторых случаях
Что возвращает евал? Как ловить ошибку? Я со своего домена ЖРУ аякс, потому испольтзую евал. Про старыне провзеры сказало правильно насчет JSON
У меня такой вопрос: стоит ли использовать eval в node.js? Если да/нет, то почему? Интересует именно дела, касающиеся безопасности.
eval(«function login() < alert("Something here . ") >«);
// and then call the login function it doesnt work
login();
//what can i do to make this work?
You must use different quotes. For example, if you use a double quotes for eval parameter, then inside this parameter use a single quotes:
eval("function login() < alert('Something here . ') >"); // and then call the login function it doesnt work login();
eval('function login() < alert("Something here . ") >'); // and then call the login function it doesnt work login();
Как использование «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:
- Формировать JavaScript, используя только доверенные источники.
- При отправке запросов, пользоваться необходимыми методами защиты от cross-forgery
Если есть что‐то ещё, пожалуйста дополните. Я сравнительно недавно перебрался в web‐программирование, и чувствую себя как бывший сотрудник ИЯФ в ларёчном бизнесе в 90-е.
Эх, невежливо вы веб-программирование в туалет макаете. Совершенно напрасно. На вебе есть очень серьезные вещи. Но это отвлечение.
В eval действительно много опасности, но он вполне применим в ряде вещей, иначе бы его давно убрали из языка.
Если кратко, то все опасности заключаются в том, что отдавая eval-у текст, программист практически не проверяет его на валидность. Это опасно не только внедрением вредоносного кода, но и элементарными ошибками ява-скрипта, которые могут завалить страницу в браузере.
То, что написано жестко — обычно более-мнее отлажено. То, что попадает в евал, на практике отладить заметно сложнее.
Поэтому в ряде случаев лучше пользоваться альтернативой (в т.ч. специальными функциями для парсинга JSON).
Что касается пасинга других диалектов на клиенте — то вы, батенька, переаботали в ИЯФ, в вебе принято клиента не нагружать мартышкиным трудом. Да и сервер тоже надо бы поберечь. Принято такие вещи (парсинг, компиляция) производить на разработчицкой машине, а в сеть выкладывать уже преобразованное. Погуглите CofeeScript, чтобы примерно понять.
Короче, Илья,
статья очень маленькая, без разъяснений и неожиданно обрывается, оставив очень много вопросов.
То у вас есть введение, часть 1, часть 2, заключение и всё понятно, а то вот эта статья.
Всем привет, у меня интересный вопрос, в консоли браузера можно выполнить eval, без всяких проблем, это что тоже уязвимость получается, просто не пойму как можно защитить использование eval?, не делать поле для ввода пользователем вредоносного кода с обработчиком eval, так в можно просто взять и захреначить это в консоли браузера, или консоль браузера это другая история?
JavaScript eval()
If the argument is an expression, eval() evaluates the expression. If the argument is one or more JavaScript statements, eval() executes the statements.
Do NOT use eval()
Executing JavaScript from a string is an BIG security risk.
With eval(), malicious code can run inside your application without permission.
With eval(), third-party code can see the scope of your application, which can lead to possible attacks.
Syntax
Parameters
Parameter | Description |
string | A JavaScript expression, variable, statement, or sequence of statements |
Browser Support
eval() is an ECMAScript1 (ES1) feature.
ES1 (JavaScript 1997) is fully supported in all browsers:
Chrome | Edge | Firefox | Safari | Opera | IE |
Yes | Yes | Yes | Yes | Yes | Yes |