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

Eval против JSON.parse

11.11.2025, 17:46. Показов 1346. Ответов 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
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3940 / 2042 / 829
Регистрация: 13.03.2010
Сообщений: 6,715
12.11.2025, 10:28
Лучший ответ Сообщение было отмечено 755 как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 755 Посмотреть сообщение
Да, задал вопрос и было бы и интересно услышать на него ответ.
1. eval исполняет код, а не парсит данные. Любая подмена ответа (взлом сервера или БД, XSS, HTTP, прокси/расширения/антивирус, CDN, да что угодно) = произвольный JS в браузере.

2. С eval вы сами обязаны правильно экранировать строки, в то время как json_encode делает это корректно "из коробки".

3. Аргумент "одна операция вместо двух" неверный: и eval, и JSON.parse парсят строку, только eval ещё и исполняет.

4. eval априори медленнее любой "альтернативы".

5. Правильным решением будет в PHP сделать echo json_encode($arr, JSON_UNESCAPED_UNICODE);, а в JS const m_el = JSON.parse(xhr.responseText); (ну или fetch(...).then(r=>r.json())).
1
 Аватар для sad67man
2598 / 1502 / 689
Регистрация: 23.08.2015
Сообщений: 3,798
12.11.2025, 11:15
Цитата Сообщение от 755 Посмотреть сообщение
В php формируется динамически строка выполняемого кода типа $st= 'm_el = ["знач. 1","знач. 2","знач. 3"];,'
Я так и не понял, как вы формируете эту строку без json_encode?
0
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
12.11.2025, 11:41  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Т.е. ты и ответ прямой не воспринял...
Извините, Usaga, не подумайте, что хочу Вас обидеть или оскорбить, но Ваш ответ меня не удовлетворил.
Во-первых, тема создавалась как дискуссионная. В Вашем же ответе не увидел аргументов за или против:
• для этого есть JSON (можно и другие форматы) - да, есть. Но и eval c этим справляется. А чем лучше JSON - из ответа не ясно.
• п.2. меня также не убедил - по нему выразил ранее свои сомнения.

И вот только от gogolik наконец-то прозвучали аргументы против eval. Причем аргументированные.
Особенно п.1. Как раз то, что меня изначально и беспокоило.
• по п.2 - это делается элементарно. И ошибки легко выявляются при отладке.
• по п.3-4. - не совсем так.
в php преобразование в строку, которой нет при eval (это и имел виду под первой операцией)
PHP
1
echo json_encode($m_filJs);
а если несколько массивов, а плюс еще передача переменных:
PHP
1
echo json_encode(array($m_filJs, $m_func, $m_filV, $m_vyz, $inf));
И все это уже надо преобразовать обратно в js -вторая операция JSON.parse или eval.
Да, eval выполняет интерпретатор js, поэтому операция будет медленне, чем JSON.parse. Но при нескольких массивов их еще надо разъединить (возможно, я использовал не лучший способ):
JavaScript
1
2
3
4
 mas= JSON.parse(xmlHttp.responseText);
 mas_filJs= mas[0];
 mas_filJsKol= mas_filJs.length;
 ...
eval же в одной команде сформирует сразу все массивы.
И самое на мой взгляд важное: eval работает на стороне клиента, а json_encode на стороне сервера - хотя и в одном и в другом случае не думаю, что время имеет существенное значение.

Добавлено через 14 минут
Просто отвечаю на вопрос sad67man, чтобы кто-либо не подумал, что спорю или что-то доказываю:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
 $s_r= '';          // разделитель
 $st= 'm_stIn_vs = [';
 // Запрос к таблице БД
 for ($i = 0 ; $i < $kZap_fi ; ++$i)    {
  $st.=  $s_r. '"'. $row[$nm_p1] . '"'; 
  if (empty ($s_r))
    $s_r = ',';
 }
 $st=  $st . "];";
 echo $st;
?>
Запрос к БД только как один из вариантов, откуда берутся данные. Дальше запускается eval - после его выполнения в данном случае m_stIn_vs получен.
Надеюсь, смог ответить на Ваш вопрос ?

Добавлено через 8 минут
Да, gogolik, забыл поблагодарить за развернутый ответ и потраченное на него время.
0
 Аватар для sad67man
2598 / 1502 / 689
Регистрация: 23.08.2015
Сообщений: 3,798
12.11.2025, 11:43
Цитата Сообщение от 755 Посмотреть сообщение
Запрос к БД только как один из вариантов, откуда берутся данные.
Если там будут пользовательские данные или спец символы, то можно поломать js.
json_encode как раз защитит от инъекций и при его помощи легче формировать вложенные объекты.
0
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3940 / 2042 / 829
Регистрация: 13.03.2010
Сообщений: 6,715
12.11.2025, 11:52
755, учитесь сразу делать правильно, а не как попало. Вот основной посыл отвечающих.
0
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 335
12.11.2025, 12:08  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
Если там будут пользовательские данные или спец символы, то можно поломать js.
В данном случае у меня таким образом формировался массив названий из справочника для выпадающего списка. Соответственно знаю, что он содержит.
Чисто теоретически: если например таким образом формировать список брендов (когда-то давно, когда только был знаком с php и формировал справочник брендов, в их названиях обнаружил спецсимволы, которые провоцировали ошибки. Но эту проблему тогда легко решил, если не подводит память другой кодировкой строк.

Добавлено через 15 минут
Цитата Сообщение от gogolik Посмотреть сообщение
учитесь сразу делать правильно, а не как попало. Вот основной посыл отвечающих.
gogolik, я только за. Знать бы только, как это - правильно. И правильно ли это. Поэтому и создал данную тему в поисках истины.

Не по теме.
И увидел Ваш комментарий к данной теме: "Тотальное нежелание учиться, нежелание слушать ..." и решил его прокомментировать.
С чего Вы взяли, что у меня отсутствует нежелание учиться - за эти полтора года понимаю, что очень многое узнал, хотя и можно было бы узнать намного больше. И не только узнал, но и стал чувствовать язык при программировании, хотя еще и очень далек до полного, а это уже дается только при практике.
А кроме того, возможно, мне уже поздно учиться, вопреки дедушке Ленину и мое предназначение не в программировании и коммерческом проекте, которым сейчас занят, а в некоммерческом (вспоминается фраза "жизнь пронеслась без явного следа, ..."), который мне поэтому кажется интереснее, но которым пока не могу заняться по некоторым причинам.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3797 / 1625 / 428
Регистрация: 14.03.2022
Сообщений: 4,043
12.11.2025, 12:27
755, ты шедевральный индивид. Благо такие встречаются не часто... Я не хотел вступать в полемику, но тут трудно удержаться.

Камрад voraa привел ранее отличную ассоциацию с ПДД.

Вот примерный макет диалога который тут происходит... Новичок (Н) и профи (П).
Н - Как лучше делать "так" или "сяк"?
П - Не делай "так"! Нужно делать "сяк".
Н - Ты меня не убедил...

Далее, что бы тебе не писали, следуют утверждения или частные случаи, что с eval тебе все равно нормально будет работать...

Отсюда, присоединяюсь к вопросу
Цитата Сообщение от voraa Посмотреть сообщение
Так зачем тогда спрашивать?
Добавлено через 42 секунды
Цитата Сообщение от 755 Посмотреть сообщение
Знать бы только, как это - правильно.
Учебники!
Там все и написано.

Добавлено через 12 минут
Оно конечно для 755 не аргумент...
Но на мой взгляд вот эта фраза из учебника уже дает правильный посыл
На данный момент нет никаких причин, чтобы продолжать использовать eval. Если кто-то всё ещё делает это, то очень вероятно, что они легко смогут заменить eval более современными конструкциями или JavaScript-модулями.
https://learn.javascript.ru/eval

Вот еще статейка https://habr.com/ru/articles/221937

Но только 755 опят напишет, что это все "не его случай"... И ничего убедительно в том для него нет.
1
93 / 88 / 17
Регистрация: 05.08.2021
Сообщений: 387
12.11.2025, 14:12
Про eval все дружно говорят что в серьезных проектах его лучше не использовать. Через него в код можно ввести что-то вредоносное
1
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3797 / 1625 / 428
Регистрация: 14.03.2022
Сообщений: 4,043
12.11.2025, 14:58
Zloyalex100, дело даже не в этом... Ответ в моей цитате из учебника.
Т.е. просто считайте что никакого eval - нет.
И жизнь ваша от этого никак не изменится.
0
 Аватар для sad67man
2598 / 1502 / 689
Регистрация: 23.08.2015
Сообщений: 3,798
12.11.2025, 15:06
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
Про eval все дружно говорят что в серьезных проектах его лучше не использовать. Через него в код можно ввести что-то вредоносное
В моем понимании. Если гарантируется, что сам код корректен и при формировании кода нет никаких дыр и XSS-инъекций, то с точки зрения безопасности он не сильно отличается от того, что если бы мы просто подставляли код в тег <script>

PHP/HTML
1
2
3
4
5
6
<?php 
$js = 'let m_el = ["знач. 1","знач. 2","знач. 3"];';
?>
<script>
<?= $js ?>
</script>
У нас на проектах фронт и бэк разделен, или занимаются разные люди.. И моя сущность бэкендера просто протестует от такого подхода..

Вообще я заметил, что именно фулстек-разработчики любят вот так размазывать логику.. часть фронта перекладывать на бэк и наоборот и считают это их преимуществом.
Самый ужасный код, с которым мне приходилось сталкиваться как раз был от таких людей.. Что у них творится в голове - одному богу известно.. ну какие-то гениальнейшие загогулины, которые на практике просто невозможно поддерживать.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3797 / 1625 / 428
Регистрация: 14.03.2022
Сообщений: 4,043
12.11.2025, 15:41
Цитата Сообщение от sad67man Посмотреть сообщение
я заметил, что именно фулстек-разработчики любят вот так размазывать логику..
Это неправильные пчёлы! И они, наверное, делают неправильный мёд! (с)
0
409 / 301 / 112
Регистрация: 28.08.2013
Сообщений: 787
13.11.2025, 17:46
Использовать eval() крайне не рекомендуется. Потому что eval() парсит строку в код, и его можно выполнить. Что не безопасно.
В JSON-объекте только данные, нет функций, что безопаснее.
Более того, если в xmlHttp указать ожидаемый ответ JSON, то браузер вернём объект в xmlHttp.response.
1
3012 / 1445 / 262
Регистрация: 16.03.2008
Сообщений: 6,443
Записей в блоге: 2
14.11.2025, 16:14
Цитата Сообщение от sad67man Посмотреть сообщение
У нас на проектах фронт и бэк разделен, или занимаются разные люди.. И моя сущность бэкендера просто протестует от такого подхода..
Вообще я заметил, что именно фулстек-разработчики любят вот так размазывать логику.. часть фронта перекладывать на бэк и наоборот и считают это их преимуществом.
При чем тут фулстек или полустек? Дело в архитектуре проекта. Если страница генерируется на стороне сервера, почему это не сделать (SSR)? Какая альтернатива? Сделать еще один дополнительный запрос?

Добавлено через 2 минуты
Ну конечно же, конкретно так мало кто делает, по моим наблюдениям. Скорее так
PHP/HTML
1
2
3
<script>
let m_el = <?=json_encode($someData)?>
</script>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2025, 16:14
Помогаю со студенческими работами здесь

Код 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 (&lt;?=$Arrbankomat?&gt;); ...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
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