Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335

Eval против JSON.parse

11.11.2025, 17:46. Показов 1362. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сразу скажу, использовал оба метода, переключился на JSON.parse пожалуй больше из соображений более быстрого написания кода на php (хотя и повлияла встреченная где-то фраза, что eval работает медленно).

Но сейчас решил разобраться из чисто теоретического интереса: почему плохо и плохо ли использование eval в таком применении:

В php формируется строка типа:
PHP
1
2
$st= 'let m_el = ["знач. 1","знач. 2","знач. 3", ...];
echo $st;
=>
js
JavaScript
1
eval.call(window, xmlHttp.responseText);
По-моему понятно, что передается строка через аякс - js ее получает из надежного источника, выполняется код и формируется в данном случае массив.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.11.2025, 17:46
Ответы с готовыми решениями:

Отловить ошибку в JSON.parse (переварить не JSON)
получаю ajax ответ от сервера, это строка json. Если на сервере скрипт падает, например по...

SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data
Всем привет, пытаюсь произвести запрос к обработчику c помощью AJAX, выдает ошибку при парсинге...

Проверка валидности разбора JSON (JSON.parse)
Пытаюсь разобрать некорректную json строку вот так: var response = JSON.parse(data); Как...

32
 Аватар для sad67man
2598 / 1502 / 689
Регистрация: 23.08.2015
Сообщений: 3,800
11.11.2025, 17:58
Цитата Сообщение от 755 Посмотреть сообщение
По-моему понятно, что передается строка через аякс - js ее получает из надежного источника, выполняется код и формируется в данном случае массив.
По коду непонятно что формируется массив, и в какую переменную кладется.. получается код размазывается.. Допустим вы где-то далее по коду увидели переменную m_el - откуда она взялась? Вы ее в коде не найдете.

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

JavaScript
1
let m_el = JSON.parse(xmlHttp.responseText);
Вот так намного нагляднее. Сразу видно, получили данные - положили в переменную.
1
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
11.11.2025, 18:22  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
По коду непонятно что формируется массив, и в какую переменную кладется.. получается код размазывается.. Допустим вы где-то далее по коду увидели переменную m_el - откуда она взялась?
Все понятно и по коду. Просто указал основную цепочку формирования m_el.

Если подробнее:
JavaScript
1
2
3
4
5
6
7
8
9
10
let m_el;
frm_mEl () ;   // форм-ние m_el
if (m_el.lenght > 0)
 . . .
 
 
function frm_mEl () {
// Обработка полученных данных через аякс
 eval.call(window, xmlHttp.responseText); 
}
Добавлено через 3 минуты
Основной вопрос, наверное, связан с безопасностью: может ли кто-то извне изменить xmlHttp.responseText на чужом компьютере, причем только в одном единственном конкретном месте ?

Добавлено через 2 минуты
Конечно и Ваш вариант sad67man, нагляден.
Но исходил из того: в php массивы надо закодировать, в js распарсить - выполняется две операции, а в моем варианте с eval только одна - выполняется сам код, который и формирует массив
0
 Аватар для sad67man
2598 / 1502 / 689
Регистрация: 23.08.2015
Сообщений: 3,800
11.11.2025, 18:39
Цитата Сообщение от 755 Посмотреть сообщение
выполняется сам код, который и формирует массив
Вы нагружаете php лишней ответственностью, вы должны отдавать данные, а не куски js.. Все остальное даже не хочется обсуждать.. такой код будет просто больно поддерживать.
2
 Аватар для voraa
1220 / 1105 / 173
Регистрация: 21.01.2024
Сообщений: 5,053
11.11.2025, 20:02
Неперешибаемое упрямство. И самое непонятное - а в чем смысл?
Вот хочу eval и буду! Назло ... себе.

Цитата Сообщение от 755 Посмотреть сообщение
Все понятно и по коду. Просто указал основную цепочку формирования m_el.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
let m_el;         // ТУТ ОПРЕДЕЛЯЕТСЯ  m_el;
frm_mEl () ;   // форм-ние m_el
if (m_el.lenght > 0)
 . . .
 
function frm_mEl () {
// Обработка полученных данных через аякс
// СТРОКА 'let m_el = ["знач. 1","знач. 2","знач. 3", ...];'
// ОПЯТЬ let m_el!  ЭТО ТОТ ЖЕ m_el ИЛИ ДРУГОЙ?
 eval.call(window, xmlHttp.responseText); 
}
Если все понятно, то объясняете нам непонятливым.
0
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
11.11.2025, 21:03  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
Неперешибаемое упрямство. И самое непонятное - а в чем смысл?
Причем здесь упрямство? Ни спорю, ни доказываю - и даже не за eval (просто сейчас начал переделывать модули выпадающего списка , написанные давно и только для них массивы значений из справочников формировались через eval ) и стало интересно, точнее, подумал, м.б. стоит выяснить, действительно ли он плох и в моем случае? И даже, если окажется, что он безопасен, быстрей всего буду пользоваться обоими вариантами по настроению.
Основной аргумент против - безопасность. Знакомился, но вопрос для моего восприятия оказался сложным, поэтому отложил его на потом (возможно, причина в недостатке знаний, а не ...). Поэтому и интересно, могут ли злоумышленники на компьютере Пользователя во время его работы залезть в код и поменять значение результата xmlHttp.responseText ? Мне кажется это практически невозможным, а м.б. и просто невозможно? Но прав ли? Не знаю. Если да, то тогда получается, что в таком формате использования eval это уже не аргумент против.

Опять моя невнимательность - поторопился (извините) - надо было исправить в php. Конечно же в php формируется:
PHP
1
2
$st= 'm_el = ["знач. 1","знач. 2","знач. 3", ...];
echo $st;
JavaScript
1
2
3
4
5
6
7
8
let m_el;         // ТУТ ОПРЕДЕЛЯЕТСЯ  m_el;
frm_mEl () ;   // форм-ние m_el
 
function frm_mEl () {
// Обработка полученных данных через аякс
// xmlHttp.responseText= ' m_el = ["знач. 1","знач. 2","знач. 3", ...];'
 eval.call(window, xmlHttp.responseText); 
}
просто sad67man, как я понял, было непонятно с кодом и попытался его раскрыть поподробнее - думал, этого окажется достаточно.
0
 Аватар для voraa
1220 / 1105 / 173
Регистрация: 21.01.2024
Сообщений: 5,053
11.11.2025, 21:19
Цитата Сообщение от 755 Посмотреть сообщение
надо было исправить в php. Конечно же в php формируется:
Код js надо править в файлах js, а не в php.
Потом, ловя ошибку вы даже не увидите, что там у вас выполняется.
Цитата Сообщение от 755 Посмотреть сообщение
Поэтому и интересно, могут ли злоумышленники на компьютере Пользователя во время его работы залезть в код и поменять значение результата xmlHttp.responseText ?
Вы можете быть спокойны. На вас злоумышленники внимания не обратят и ломать не будут.

Просто непонятно. Вы спрашиваете что то. Вам люди, у которых опыта и знаний побольше, отвечают, как сделать лучше и правильнее. Но
Цитата Сообщение от 755 Посмотреть сообщение
быстрей всего буду пользоваться обоими вариантами по настроению.
Так зачем тогда спрашивать? Делайте все по настроению. Какое настроение, то и получится.
2
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
11.11.2025, 21:49  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
быстрей всего буду пользоваться обоими вариантами по настроению.
Так зачем тогда спрашивать?
• Написал: буду пользоваться обоими (возможно), если eval безопасен. Пока же так ответа и нет.
Цитата Сообщение от voraa Посмотреть сообщение
Вы можете быть спокойны. На вас злоумышленники внимания не обратят и ломать не будут.
Поживем, увидим...
Цитата Сообщение от voraa Посмотреть сообщение
Код js надо править в файлах js, а не в php.
Потом, ловя ошибку вы даже не увидите, что там у вас выполняется.
Легко - речь о конкретном случае, когда знаешь, что на выходе.
Можно привести такой аргумент: m_el = JSON.parse() форм-ся в php, хотя данные для js. Не буду утрировать, что данные для js формируются в php. В моем же примере так же формируются данные для js в php, правильность которых (а соответственно и логику) легко проверю и в js, т.е. логика отладки примерно одинаковая.
0
 Аватар для sad67man
2598 / 1502 / 689
Регистрация: 23.08.2015
Сообщений: 3,800
12.11.2025, 02:41
Цитата Сообщение от 755 Посмотреть сообщение
Но исходил из того: в php массивы надо закодировать, в js распарсить - выполняется две операции, а в моем варианте с eval только одна - выполняется сам код, который и формирует массив
json_encode нужно же делать в обоих случаях. Иначе как вы формируете массив для js?
0
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
12.11.2025, 08:22  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
json_encode нужно же делать в обоих случаях. Иначе как вы формируете массив для js?
Ошибаетесь.
В php формируется динамически строка выполняемого кода типа $st= 'm_el = ["знач. 1","знач. 2","знач. 3"];,' после чего через аякс данная строка $st передается в js, в котором после выполнения кода в eval.call(window, xmlHttp.responseText); формируются элементы массива. И все, данные переданы и сформированы. Попробуйте, просто выполните в php 2 две эти строки, и увидите - никакой json_encode не нужен.
0
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3940 / 2042 / 829
Регистрация: 13.03.2010
Сообщений: 6,716
12.11.2025, 08:24
755, вы совет пришли спрашивать или убеждать всех в своей правоте? Если второе, то оно нам тут даром не надо, тем более, если вы делаете какую-то ахинею.
0
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
12.11.2025, 08:42  [ТС]
Цитата Сообщение от gogolik Посмотреть сообщение
755, вы совет пришли спрашивать или убеждать всех в своей правоте?
gogolik, странно такое слышать, по-моему ни в одном из моих сообщений нет и намека на то, что кого-то убеждаю - после вопроса с моей стороны практически только ответы и то только потому, что считаю невежливым не ответить тем, кто тратит на меня свое время. И сейчас также отвечаю по этой же причине.
Да, задал вопрос и было бы и интересно услышать на него ответ.
Но вот ответа на вопрос так и не услышал, хотя он мог бы быть достаточно лаконичным: да / нет - почему, (например, нельзя - могут подменить данные).

Добавлено через 6 минут
Кстати, и применение eval для этих целей не мог сам придумать, а когда-то давно, когда только изучал способы передачи данных через аякс должен был увидеть данный вариант
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
12.11.2025, 08:57
Цитата Сообщение от 755 Посмотреть сообщение
Да, задал вопрос и было бы и интересно услышать на него ответ.
Ответ: использовать `eval` очень плохо для обмена данными.

Во-первых, для этого есть JSON (можно и другие форматы)
Во-вторых, бэк не должен завязываться на то, кто и как будет обрабатывать ответ. Это может делать и не браузер, а мобильный клиент на Java
В-третьих, какая такая неприодолимая сила тебя гонит творить всякую ахинею и игнорировать учебники по языку, где принятые практики расписаны и разжёваны?
1
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
12.11.2025, 09:11  [ТС]
Спасибо, Usaga, за ответ.
И просто отвечая на вопрос:
Цитата Сообщение от Usaga Посмотреть сообщение
какая такая неприодолимая сила тебя гонит творить всякую ахинею и игнорировать учебники по языку
на учебники пока нет времени - хочется побыстрее закончить и запустить проект. Потому м.б. будет время и на литературу.

по п.2.
Цитата Сообщение от Usaga Посмотреть сообщение
Это может делать и не браузер, а мобильный клиент на Java
Возможно ошибаюсь. Но, как понимаю, пишу конкретно под браузер, под мобильную версию изменятся формы и соответственно технология.
0
 Аватар для voraa
1220 / 1105 / 173
Регистрация: 21.01.2024
Сообщений: 5,053
12.11.2025, 09:36
Цитата Сообщение от 755 Посмотреть сообщение
на учебники пока нет времени - хочется побыстрее закончить и запустить проект.
На изучение ПДД и вождение пока нет времени. Хочется на работу и на дачу на машине ездить.
1
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
12.11.2025, 09:56
Цитата Сообщение от 755 Посмотреть сообщение
на учебники пока нет времени - хочется побыстрее закончить и запустить проект.
"Хочется" и "так это работает" - разные вещи. И я тебе скажу - оно так не работает. Ты на выдумывание ахинеи и борьбу с ней потратишь больше времени. Вплоть до того, что до результата дело и не дойдёт.

Цитата Сообщение от 755 Посмотреть сообщение
Но, как понимаю, пишу конкретно под браузер, под мобильную версию изменятся формы и соответственно технология.
Так писать можно универсально, не завязываясь ни на что. И так и надо делать.
0
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
12.11.2025, 10:04  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Так писать можно универсально, не завязываясь ни на что. И так и надо делать.
Это было бы хорошо, но думается не всегда возможно. Например, использую табличный формат, который под мобильную версию не подойдет. Поэтому уже универсально не получится: под мобильную версию нужно будет разработать другой, более оптимальный формат, а т.к. форма формируется на сервере, то и соответственно не получается универсально.
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
12.11.2025, 10:07
755, ты сам это только что придумал, да? Я тебе говорю факты, продиктованные опытом, не только моим, а ты придумываешь что-то чтобы просто поспорить?

Прекращай эту ерунду. Нормально делать возможно всегда. Если нет никакого желания перенимать опыт, учиться делать быстро и нормально, то да - не всегда возможно.
0
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
12.11.2025, 10:19  [ТС]
Благодарю, Usaga, лучше на этом закончить тему. Зря вообще ее создал - отнял чужое время да и свое чуть чуть жаль - потрачено без пользы.
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
12.11.2025, 10:28
Цитата Сообщение от 755 Посмотреть сообщение
потрачено без пользы.
Т.е. ты и ответ прямой не воспринял... Уже не в первый раз. Зачем тогда спрашивать?..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2025, 10:28
Помогаю со студенческими работами здесь

Код 200 SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
Ребята подскажите плиз, пытаюсь добавить форму отправки сообщений на сайт. После отправки выдает...

Постоянная ошибка SyntaxError: JSON.parse: unterminated string at line 1 column 132829 of the JSON data
что бы не делал, нормально в консоле JSON не выводит, нужно раз 20 обновить только тогда выведет...

SyntaxError: JSON.parse: unexpected character at line 2 column 5 of the JSON data
Здравствуйте. у меня есть простая задачка, которую никак не получается решить. Есть 2 файла в...

Ошибка "json.parse unexpected character"
Реализую на сайте систему комментариев. Добавление комментариев в базу происходит путём передачи...

Не работает JSON.parse, ошибка Unexpected token o
подскажите пожалуйста почему может не работать: var obj=JSON.parse (<?=$Arrbankomat?>); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru