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? Если да/нет, то почему? Интересует именно дела, касающиеся безопасности.
But if i want to do this :
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:
or
Как использование "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, так в можно просто взять и захреначить это в консоли браузера, или консоль браузера это другая история?
Roksa biz
Roksa plock
Roksa ok
There is indeed a lot of danger in Suntrust Bank Near Me - ATM, Cafe & Branch Locations but it is quite applicable in a number of things, otherwise it would have been removed from the language long ago.
Wow, just finished going through this code, and I must say, Drift Hunters Drift Hunters it's not for the faint of heart! The complexity and depth of the algorithms implemented here are truly remarkable. It's clear that a lot of thought and expertise went into crafting these solutions. This isn't your everyday coding challenge; it's a deep dive into some serious computer science principles. Hats off to anyone who can grasp this on the first read – it took me several attempts to fully appreciate the nuances. A fantastic resource for those looking to push their coding skills to the limit!
мощный 1v1 lol инструмент, который следует использовать осторожно и осознанно, принимая во внимание потенциальные риски безопасности и другие недостатки.
Playing tap road every day helps me improve my concentration and quick reflexes. You should try it now!
Playing tap road every day helps me improve my concentration and quick reflexes. You should try it now!
It's more convenient if you can play the game anywhere you like. fnaf 1
подсунуть на его место элемент bitlife iframe, содержимое которого выглядит в точности как ваша страница, только находится эта страница на совершенно другом сервере и данные, введенные пользователем, использует по-своему.
""朕天下娛樂城""是一個融合現代娛樂與傳統遊戲的綜合平台,提供多種精彩的遊戲體驗,包括線上賭場、體育博彩、電子遊戲等。無論是對於賭博愛好者還是休閒玩家,都能在這裡找到心儀的娛樂項目。平台致力於打造安全、公正的遊戲環境,讓每位玩家都能享受愉快的遊戲過程,並有機會獲得豐富獎勳與獎金。
"朕天下娛樂城"是一個融合現代娛樂與傳統遊戲的綜合平台,提供多種精彩的遊戲體驗,包括線上賭場、體育博彩、電子遊戲等。無論是對於賭博愛好者還是休閒玩家,都能在這裡找到心儀的娛樂項目。平台致力於打造安全、公正的遊戲環境,讓每位玩家都能享受愉快的遊戲過程,並有機會獲得豐富獎勳與獎金。
老虎機訣竅在於理解遊戲機率與設定。首先,選擇波動較低的機型,這樣可以增加中獎機會。其次,確保了解每個機器的賠率表,掌握如何最大化你的投注回報。記得管理好預算,避免過度投注,並設定好勝利或失敗的上限。最後,保持冷靜,不要因為一時的運氣而做出衝動的決定。
老虎機訣竅在於理解遊戲機率與設定。首先,選擇波動較低的機型,這樣可以增加中獎機會。其次,確保了解每個機器的賠率表,掌握如何最大化你的投注回報。記得管理好預算,避免過度投注,並設定好勝利或失敗的上限。最後,保持冷靜,不要因為一時的運氣而做出衝動的決定。
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.