Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: eval(), goto(), новые технологии
 
 автор: SHAman   (11.02.2011 в 10:50)   письмо автору
 
 

Про эвал поясните пожалуйста.

  Ответить  
 
 автор: Crux   (11.02.2011 в 14:48)   письмо автору
 
   для: SHAman   (11.02.2011 в 10:50)
 

Техника использования eval() делает систему уязвимой, если источник используемых данных не относится к доверяемым. В качестве таких данных может выступать вредоносный JavaScript код для атак класса "Внедрение кода" . С помощью данной уязвимости возможно осуществлять кражу данных, подделку аутентификации... бла-бла-бла

еще говорят что eval затрудняет отладку кода.

страшно? на мой взгляд не очень, уязвимости и сложности в отладки это дело рук программиста, а не какой-либо функции.

PS возможно Абырвалг знает что-то еще про eval, я бы тоже выслушал/почитал с удовольствием.

  Ответить  
 
 автор: Абырвалг   (11.02.2011 в 15:26)   письмо автору
 
   для: SHAman   (11.02.2011 в 10:50)
 

В общем, всё просто:

Я учился программированию в древние, ещё советские времена.
Первым моим языком был Fortran IV
В нём у каждого оператора (один на строке, сиречь - на перфокарте) надо было ставить так называемую "метку" - натуральное число (уникальное).
И существовал "безусловный оператор перехода" - типа GO TO 234, где 234 - это метка той строки (оператора), куда следовало переходить.

Уровень программиста оценивался, в первую очередь, по наличию/отсутствию этих самых операторов GO TO метка в программе: если хотя бы один такой оператор был, значит программист - полный лох и просто не умеет думать.
В общем, не было в Фортране таких задач, где без GO TO нельзя было обойтись.

Соответственно, в Javascript'e нет таких задач, где без eval () нельзя обойтись.
А раз нет, то и использовать его не надо.
Уважающий СЕБЯ программист НИКОГДА не будет его использовать.

Кроме того, он небезопасен (о чём уже написано), ну и - он О-О-О-ОЧЕНЬ тормозной.

  Ответить  
 
 автор: SHAman   (11.02.2011 в 15:51)   письмо автору
 
   для: Абырвалг   (11.02.2011 в 15:26)
 

Интересная история, которая не сказала ничего о том, почему нельзя исползовать eval.

Тормознутость может быть не критичной. Тем более, если это небольшой скрипт, получаемый аяксом. Сомневаюсь что это будет заметно.

Еще мы узнали что уважающий себя вы никогда не будете использовать eval. Но это не показатель.

  Ответить  
 
 автор: cheops   (11.02.2011 в 16:03)   письмо автору
 
   для: Абырвалг   (11.02.2011 в 15:26)
 

GO TO не стал поощряться гораздо позже расцвета FORTRAN IV, когда в машинное время резко подешевело, а время разработчика подорожало и когда производительность отошла на второй план, а на первый план вышел человеческий фактор. На FORTRAN имеется масса мат.библиотек, где GO TO используется с изяществом и позволяя добиться более высокой производительности в вычислениях, по сравнению с вариантами без GO TO. Более того, в ранних версиях Fortran (помоему в IV еще точно было) использовались ASM-приближенные конструкции вроде вычисляемого GO TO и множественного входа в функции и на это были причины - машины были слабые и позволить себе прожорливый язык высокого уровня могли не многие.
Собственно, если касаться eval() то да, от его использования лучше отказаться, так как это требует множество времени в отладке, сопровждении и поиска ошибок.

Но при всем при том, в следующей фразе я бы исправил "никогда" на "почти никогда"
>Уважающий СЕБЯ программист НИКОГДА не будет его использовать.

  Ответить  
 
 автор: elenaki   (11.02.2011 в 16:59)   письмо автору
 
   для: cheops   (11.02.2011 в 16:03)
 

в моей первой книге по Паскалю была такая фраза (запомнила наизусть, уж очень она мне понравилась)
====================================
Hевозможно научить хорошо программировать студентов, ориентированных первоначально на Бэйсик. Kак потенциальные программисты они умственно оболванены без надежды на исцеление.
====================================

конец цитаты

  Ответить  
 
 автор: Crux   (11.02.2011 в 21:07)   письмо автору
 
   для: Абырвалг   (11.02.2011 в 15:26)
 

вон Вы о чём...
на самом деле это дело вкуса.
вот например Вы используете оператор with (http://softtime.ru/forum/read.php?id_forum=4&id_theme=78599&page=2), а он тоже из серии: "Уважающий СЕБЯ программист НИКОГДА не будет его использовать."

  Ответить  
 
 автор: Crux   (11.02.2011 в 22:10)   письмо автору
 
   для: Crux   (11.02.2011 в 21:07)
 

вдогонку.
рассмотрим две js библиотеки jQuery и JsHttpRequest, авторы этих библиотек наверняка уважающие себя программисты.
JsHttpRequest непосредственно заточена на ajax, в jQuery так же есть функционал обеспечивающий работу с ajax.
в JsHttpRequest в качестве ответа принимают данные в виде JSON, в jQuery так же можно указать что в качестве ответа будут JSON-данные.

в JsHttpRequest, для инициализации данных, спокойно используются eval

var _42=req.responseText||"{ js: null, text: null }";
eval("JsHttpRequest._tmp = function(id) { var d = "+_42+"; d.id = id; JsHttpRequest.dataReady(d); }");


в jQuery еще в версии 1.3 также использовался eval

// Get the JavaScript object, if JSON is used.
if ( type == "json" )
  data = window["eval"]("(" + data + ")");

начиная с версии 1.4 eval в библиотеке уже не найдешь, вместо этого:

if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
                    .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
                    .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {

                    // Try to use the native JSON parser first
                    if ( window.JSON && window.JSON.parse ) {
                        data = window.JSON.parse( data );

                    } else {
                        data = (new Function("return " + data))();
                    }



вот так вот. желающие делайте свои выводы. а так же здесь можно найти альтернативу eval ))

  Ответить  
 
 автор: Абырвалг   (12.02.2011 в 09:04)   письмо автору
 
   для: Crux   (11.02.2011 в 22:10)
 

>"авторы этих библиотек наверняка уважающие себя программисты"

"Это вряд ли"(с)
По определению: люди, не уважающие других, себя тоже уважать не могут.


JSON и Jquery написаны авторами их изначально "для дебилов".
Делайте вывод :-))

  Ответить  
 
 автор: cheops   (12.02.2011 в 11:34)   письмо автору
 
   для: Абырвалг   (12.02.2011 в 09:04)
 

>JSON и Jquery написаны авторами их изначально "для дебилов".
FORTRAN как бы тоже изначально написан "для дебилов", да и язык C тоже, а операционная система UNIX (старейшая из существующих и представленная в десятке вариантов) изначально у уважаемых создателей операционных систем вообще вызывала приступы истерического смеха, настолько дебильной казалась идея писать операционную систему на языке высокого уровня, а не Assembler.
Только так называемые FORTRAN-дебилы, были математиками, которым не досуг было изучать машинные коды и Assembler-ы каждого вида машины, которых у них были десятки. Сложнейшие мат.пакеты, написанные в 70-е до сих пор прекрасно работают, хотя машин сменилось не пересчитать.
Язык C/С++ основа современного программирования и "дебилы", которые на нём пишут по сути создают весь хребет IT, а "не дебилы", которые отказались в свое время его изучать и продолжали копать Assebler работают стропальщиками на заводах, ибо никому не нужны - процессоров много, а современное ПО создавать на Assebler слишком долго, дорого и ненадежно.
На операционной систме UNIX, первой написанной на языке высокого уровня и поэтому сохранившейся для сотен различных аппаратных систем, держится весь интернет. Операционные системы "не дебилов" никто не помнит. Как назвать пользователей "Windows" в этой терминологии вообще не понятно.

  Ответить  
 
 автор: sim5   (12.02.2011 в 12:49)   письмо автору
 
   для: cheops   (12.02.2011 в 11:34)
 

>Как назвать пользователей "Windows" в этой терминологии вообще не понятно.

Что же тут непонятного - дебилы-форточники. ))

  Ответить  
 
 автор: cheops   (12.02.2011 в 11:42)   письмо автору
 
   для: Абырвалг   (12.02.2011 в 09:04)
 

>JSON и Jquery написаны авторами их изначально "для дебилов".
Только за то, что jQuery сгаживает различия браузеров - уже в ноги нужно поклониться, такие библиотеки должны быть встроены в каждый браузер, (и вообще JS должна разрабатывать отдельная команда, одна на все браузеры, как это с Flash), чтобы разработчики не утяжеляли код страниц, а пользователи не таскали их.

Как речь заходит о CSS или JavaScript - это же рехнуться можно, в каждом браузере свои заморочки. Вот это дебелизм, а то что проблему хоть как-то пытаются решать нет.

PS Пока различия в браузерах сохраняются, библиотеки вроде jQuery будут процветать - это данность, с которой, как её не назови, придется иметь дело.
PPS Делов то всего, предоставить пользователям возможность загружать сторонюю библиотеку JavaScript: через 3 года выжила бы одна наиболее популярная библиотека с открытым кодром, которую бы все новые браузеры включали бы. Все бы jQuery сдохли бы в одночасье. А так получили еще набор языков программирования специального назначения (буд-то без него их мало в Web) и он будет существовать и развиваться до тех пор, пока ситуация останется неизменной. После того, как jQuery вытяснит все библиотеки - посмотрите, её еще и в браузеры будут включать...

  Ответить  
 
 автор: Абырвалг   (12.02.2011 в 09:02)   письмо автору
 
   для: Crux   (11.02.2011 в 21:07)
 

Не скажите.
Оператор with - он "в тему" внутри функций, где я его и использую.
В "глобале", разумеется, он тормозит - там я его не применяю.

  Ответить  
 
 автор: Crux   (13.02.2011 в 04:50)   письмо автору
 
   для: Абырвалг   (12.02.2011 в 09:02)
 

Скорость выполнения JavaScript'a по большой части зависит от движка/браузера, так что гоняться за скоростью дело очень трудозатратное.

По поводу оператора with - на мой взгляд самый большой минус в его использовании, так это то, что с ним код плохо сжимается компрессорами.

  Ответить  
 
 автор: Crux   (18.02.2011 в 15:06)   письмо автору
 
   для: Crux   (13.02.2011 в 04:50)
 

вчера конференция была "HTML5 Camp – веб-конференция о будущем веба",
поглядел выступление: "Эволюция JavaScript: ES5.0", Илья Кантор.
так вот в ES5.0 в режиме strict оператор with запрещён, даст ошибку SyntaxError.

  Ответить  
 
 автор: Абырвалг   (18.02.2011 в 15:40)   письмо автору
 
   для: Crux   (18.02.2011 в 15:06)
 

Илья Кантор - дутый пузырь рунета.
Вести мастер-класс по JS, не умея написать ни одного достойного кода на JS - это надо суметь:-)

Я в своё время давал, наверно, самый первый отзыв на его "ужимки и прыжки" на manual.ru, когда он начинал проекты css.manual.ru (и http://algolist.manual.ru/): тупой перевод спецификации с английского на русский ещё никого не делал умнее :-)
-----

Что до стандарта ES5.0, то да - with там в строгой версии запрещён - http://www.ecma-international.org/activities/Languages/Draft%20Standard%20ECMA-262%205.1%20edition.pdf.

  Ответить  
 
 автор: deimand   (12.02.2011 в 22:44)   письмо автору
 
   для: Абырвалг   (11.02.2011 в 15:26)
 

>в Javascript'e нет таких задач, где без eval () нельзя обойтись.

В Javascript'e есть такие задачи, где нельзя обойтись без eval ().
Другое дело, то что вам не приходилось решать такие задачи.

  Ответить  
 
 автор: Абырвалг   (13.02.2011 в 05:04)   письмо автору
 
   для: deimand   (12.02.2011 в 22:44)
 

>"В Javascript'e есть такие задачи, где нельзя обойтись без eval ()."

Примерчик дайте.
Хотя бы один.
Хотя бы самый маленький.

  Ответить  
 
 автор: deimand   (13.02.2011 в 16:38)   письмо автору
 
   для: Абырвалг   (13.02.2011 в 05:04)
 

Блог.

Внешние ссылки поставленные пользователем при написании статьи не должны индексироваться, урлы для этих ссылок должны отсутствовать в скриптах или html документе, но ссылки должны корректно работать при включенном js, анкоры ссылок не могут отсутствовать при отключенном js, так как это попортит текст, и не должны иметь отличные от ссылок стили css.

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

Описанное выше тз я выполнил с применением ф-ии eval() уложившись в 2 Кб js кода. Если вы напишите решение этой задачи без использования eval() хотя бы до 4 Кб, я так и быть, соглашусь с вами, что eval() действительно можно было и не использовать. Свыше 4 Кб уже нужно будет думать, стоит ли использовать столько лишнего кода, или может практичнее 2 Кб запихнуть в eval()...

  Ответить  
 
 автор: cheops   (11.02.2011 в 16:04)   письмо автору
 
   для: SHAman   (11.02.2011 в 10:50)
 

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

  Ответить  
 
 автор: SHAman   (11.02.2011 в 16:22)   письмо автору
 
   для: cheops   (11.02.2011 в 16:04)
 

Вот это хороший аргумент. Спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования