Чем заменить eval?

Sunday

Cōgitō ergō sum
Регистрация
13 Дек 2009
Сообщения
823
Реакции
342
Есть такой кусок кода, который передает и выводит данные аяксом:
HTML:
$.post("/ajax/get_city.php", {type: type, id: $("#"+obj).val()}, onAjaxSuccess);
function onAjaxSuccess(data) {
         out = document.getElementById(type);
         for (var i = out.length - 1; i >= 0; i--) {
              out.options[i] = null;
         }
         eval(data);
Без eval как-то можно обойтись? Ато он меня напрягает
 
Самый первый вариант, который приходит в голову - это регулярки. По сути, нужно будет написать свой парсер, который json строку приведет к необходимому виду. Но такой подход - это очевидный быдлокодинг с точки зрения оптимизации. Не понимаю, чем не нравится eval? В контексте ajax - это общепринятая практика.
 
Пишем в data со стороны сервера нормальный JSON (до этого я понимаю писался JS код).

Код:
$data = array(
  array('id' => 1, 'name' => 'Moscow'),
  array('id' => 1, 'name' => 'Kaliningrad'),
  ...
);
header('Content-Type: application/json');
die(json_encode($data));

Код:
  var list = '';
  for (var i in data) {
    var elm = data[i];
    list += '<option value="' + elm.id + '">' + elm.name + '</option>';
  }
  $('.some-selector').html('<select>' + list + '</select>')
 
Без eval как-то можно обойтись? Ато он меня напрягает
Я думаю Вы немного запутались, из-за сходства функций в PHP и яваскрипт.
К eval в PHP действительно нужно относиться с бооольшой осторожностью, особенно если пользователь имеет доступ к входным данным для него.
А вот eval в яваскрипте абсолютно безопасен, ибо работает на стороне клиента и ничего с Ваши сервером сделать не может:)
 
Не совсем так. Допустим, через аякс подгружается блок контента неважно чего, но пользователи это способны менять этот контент. Например, последние комментарии.

И это работает как-то так:

Код:
// server side
fromDb = 'first comment';
data = 'console.log("' + fromDb + '")'; // from server

// client side
eval(data);

А вот уже XSS:
Код:
// server side
fromDb = 'first comment"); alert("XSS"); console.log("';
data = 'console.log("' + fromDb + '")'; // from server

// client side
eval(data);

Конечно можно говорить про фильтрацию данных и т.п., но eval вовсе не безопасен.

Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Назад
Сверху