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

Eval против JSON.parse

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

Студворк — интернет-сервис помощи студентам
Сразу скажу, использовал оба метода, переключился на 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
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); Как...

78
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3961 / 2124 / 833
Регистрация: 13.03.2010
Сообщений: 6,975
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
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
12.11.2025, 11:15
Цитата Сообщение от 755 Посмотреть сообщение
В php формируется динамически строка выполняемого кода типа $st= 'm_el = ["знач. 1","знач. 2","знач. 3"];,'
Я так и не понял, как вы формируете эту строку без json_encode?
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
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
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
12.11.2025, 11:43
Цитата Сообщение от 755 Посмотреть сообщение
Запрос к БД только как один из вариантов, откуда берутся данные.
Если там будут пользовательские данные или спец символы, то можно поломать js.
json_encode как раз защитит от инъекций и при его помощи легче формировать вложенные объекты.
0
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3961 / 2124 / 833
Регистрация: 13.03.2010
Сообщений: 6,975
12.11.2025, 11:52
755, учитесь сразу делать правильно, а не как попало. Вот основной посыл отвечающих.
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
12.11.2025, 12:08  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
Если там будут пользовательские данные или спец символы, то можно поломать js.
В данном случае у меня таким образом формировался массив названий из справочника для выпадающего списка. Соответственно знаю, что он содержит.
Чисто теоретически: если например таким образом формировать список брендов (когда-то давно, когда только был знаком с php и формировал справочник брендов, в их названиях обнаружил спецсимволы, которые провоцировали ошибки. Но эту проблему тогда легко решил, если не подводит память другой кодировкой строк.

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

Не по теме.
И увидел Ваш комментарий к данной теме: "Тотальное нежелание учиться, нежелание слушать ..." и решил его прокомментировать.
С чего Вы взяли, что у меня отсутствует нежелание учиться - за эти полтора года понимаю, что очень многое узнал, хотя и можно было бы узнать намного больше. И не только узнал, но и стал чувствовать язык при программировании, хотя еще и очень далек до полного, а это уже дается только при практике.
А кроме того, возможно, мне уже поздно учиться, вопреки дедушке Ленину и мое предназначение не в программировании и коммерческом проекте, которым сейчас занят, а в некоммерческом (вспоминается фраза "жизнь пронеслась без явного следа, ..."), который мне поэтому кажется интереснее, но которым пока не могу заняться по некоторым причинам.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
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
133 / 129 / 20
Регистрация: 05.08.2021
Сообщений: 602
12.11.2025, 14:12
Про eval все дружно говорят что в серьезных проектах его лучше не использовать. Через него в код можно ввести что-то вредоносное
1
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
12.11.2025, 14:58
Zloyalex100, дело даже не в этом... Ответ в моей цитате из учебника.
Т.е. просто считайте что никакого eval - нет.
И жизнь ваша от этого никак не изменится.
0
 Аватар для sad67man
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
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
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
12.11.2025, 15:41
Цитата Сообщение от sad67man Посмотреть сообщение
я заметил, что именно фулстек-разработчики любят вот так размазывать логику..
Это неправильные пчёлы! И они, наверное, делают неправильный мёд! (с)
0
425 / 314 / 115
Регистрация: 28.08.2013
Сообщений: 869
13.11.2025, 17:46
Использовать eval() крайне не рекомендуется. Потому что eval() парсит строку в код, и его можно выполнить. Что не безопасно.
В JSON-объекте только данные, нет функций, что безопаснее.
Более того, если в xmlHttp указать ожидаемый ответ JSON, то браузер вернём объект в xmlHttp.response.
1
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
14.11.2025, 16:14
Цитата Сообщение от sad67man Посмотреть сообщение
У нас на проектах фронт и бэк разделен, или занимаются разные люди.. И моя сущность бэкендера просто протестует от такого подхода..
Вообще я заметил, что именно фулстек-разработчики любят вот так размазывать логику.. часть фронта перекладывать на бэк и наоборот и считают это их преимуществом.
При чем тут фулстек или полустек? Дело в архитектуре проекта. Если страница генерируется на стороне сервера, почему это не сделать (SSR)? Какая альтернатива? Сделать еще один дополнительный запрос?

Добавлено через 2 минуты
Ну конечно же, конкретно так мало кто делает, по моим наблюдениям. Скорее так
PHP/HTML
1
2
3
<script>
let m_el = <?=json_encode($someData)?>
</script>
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
13.02.2026, 15:16  [ТС]
krvsa, не хотел отвлекаться ранее, но сейчас нашлось время для ответа.

Цитата Сообщение от krvsa Посмотреть сообщение
Но на мой взгляд вот эта фраза из учебника уже дает правильный посыл:

На данный момент нет никаких причин, чтобы продолжать использовать eval. Если кто-то всё ещё делает это, то очень вероятно, что они легко смогут заменить eval более современными конструкциями или JavaScript-модулями.
Считаю данную тему далеко не исчерпанной. И вот другое мнение судя по комментариям на форуме специалиста не только знающего, но и умного (о втором сужу по его интересу к математике):
• Он кажется невероятно мощным инструментом для создания самомодифицирующихся файлов в формате JSON, в которых помимо данных хранится функциональность. Например, вы можете создать сервер, который «обучается», проверяя, есть ли нужная вам функциональность ('функциональность' в parsedObject), и если нет, то позволяет клиенту добавить этот метод в объект. Это, в свою очередь, позволяет создавать «живые библиотеки», которые развиваются благодаря тому, что вы обучаете их с помощью сообщений, а не редактируете код. Я не считаю eval чем-то плохим, скорее это самая мощная конструкция в JavaScript.

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

Попадались и другие мнения, типа: надо уметь им пользоваться.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
13.02.2026, 15:45
755, использовать eval или нет - все равно решать тебе...
Ведь физически ты можешь его использовать пока его совсем не запретят.
Я убиваться по нему не стану.

У меня нет "живых библиотек"... И "самообучающихся серверов"...
Я даже не знаю что это такое.
Самомодифицирующиеся файлы тоже не делаю...

Если у тебя все это есть - то можно поверить тому спецу, раз он утверждает, что без eval такого не добиться.
0
232 / 94 / 22
Регистрация: 29.02.2016
Сообщений: 489
13.02.2026, 16:44
Цитата Сообщение от 755 Посмотреть сообщение
Попадались и другие мнения, типа: надо уметь им пользоваться.
Действительно, согласно спецификации, JSON предназначен для передачи данных, а eval для выполнения произвольного кода. Так зачем при помощи eval что-то передавать, а JSONом выполнять? Пусть каждый инструмент хорошо делает то для чего предназначен.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
13.02.2026, 16:54
Цитата Сообщение от stele Посмотреть сообщение
Так зачем при помощи eval что-то передавать, а JSONом выполнять?
Тут как бы нужно понять, что у некоторых людей есть свой путь. И они будут по нему идти не смотря ни на что!
Как ты их не отговаривай...

- А кто пробовал съесть стадо?! (с)
0
232 / 94 / 22
Регистрация: 29.02.2016
Сообщений: 489
13.02.2026, 16:58
Цитата Сообщение от krvsa Посмотреть сообщение
Как ты их не отговаривай...
И до чего живо самообучется библиотека когда ей провайдер вместо содержимого подсунет страницу-заглушку.
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
13.02.2026, 21:03  [ТС]
stele, в данном случае пример был просто как пример того, что кто-то считает eval даже "самой мощной конструкцией" языка. И вполне возможно, что Вы правы о предназначении: "JSON предназначен для передачи данных, а eval для выполнения произвольного кода". Правда у меня при передаче числовых элементов массива JSON сформировал их в js в символьном формате в отличие от eval. Но, думаю, что просто не разобрался и у JSON есть настройки типа данных - пока не стал с этим разбираться - для 1-й версии достаточно и этого.

Но вот, возможно, получится использовать eval согласно спецификации и, если это получится (причем смешно, думаю использовать eval для защиты сайта и данных от проникновения - то, что большинство относят к его недостаткам) то, в отличие от мнения krvsa:
Цитата Сообщение от krvsa Посмотреть сообщение
Ведь физически ты можешь его использовать пока его совсем не запретят.
Я убиваться по нему не стану
будет очень жаль, если такое произойдет. Хотя не только надеюсь, но и уверен, что разработчики языка намного умнее меня и сами увидят его сильные стороны.
Пока же об этом рано говорить - все только на уровне идеи.
0
 Аватар для voraa
1296 / 1282 / 190
Регистрация: 21.01.2024
Сообщений: 5,935
13.02.2026, 21:56
Цитата Сообщение от 755 Посмотреть сообщение
Хотя не только надеюсь, но и уверен, что разработчики языка намного умнее меня и сами увидят его сильные стороны.
У него нет сильных сторон. Все, что может eval можно делать другими более безопасными средствами. И если eval до сих пор кому то нужен, то не потому, что он так хорош, а потому, что у программиста и программы логика хромает на все 4 ноги.
Но его не уберут никогда. Он появился в самом начале развития js. А основной принцип внесения изменений в js - "Старый код должен работать". Поэтому из js ничего не убирают. Просто рекомендуют не использовать.

Ваш пример просто кошмарен. Сервер (бэк) и браузер (фронт) должны быть максимально независимы друг от друга. Связь только по данным. И программеру бэка не должно быть никакого дела до того, как называются переменные во фронте. Программер фронта, смотря программу через несколько месяцев/лет не должен гадать откуда там взялась неописанная переменная и лезть в программу на сервере, что бы понять это.

У всего должна быть своя культура деятельности. И в программировании тоже. Цель не написать, лишь бы сейчас работала, но нужно еще и думать, как это будет сопровождаться, поддерживаться, развиваться, быть может другими людьми, быть может через несколько лет. Чем проще программа, чем дубовее код, тем лучше.
Вам это уже много раз объясняли, но бестолку.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.02.2026, 21:56

Код 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;); ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru