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

Тема в разделе "JavaScript", создана пользователем Sunday, 27 июл 2015.

Модераторы: ZiX
  1. Sunday

    Sunday

    Регистр.:
    13 дек 2009
    Сообщения:
    765
    Симпатии:
    326
    Есть такой кусок кода, который передает и выводит данные аяксом:
    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 как-то можно обойтись? Ато он меня напрягает
     
  2. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    117
    Симпатии:
    495
    Самый первый вариант, который приходит в голову - это регулярки. По сути, нужно будет написать свой парсер, который json строку приведет к необходимому виду. Но такой подход - это очевидный быдлокодинг с точки зрения оптимизации. Не понимаю, чем не нравится eval? В контексте ajax - это общепринятая практика.
     
    Sunday нравится это.
  3. Black Hat

    Black Hat Постоялец

    Регистр.:
    15 май 2015
    Сообщения:
    132
    Симпатии:
    87
    Пишем в 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>')
    
     
    Alabama и Sunday нравится это.
  4. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    196
    Я думаю Вы немного запутались, из-за сходства функций в PHP и яваскрипт.
    К eval в PHP действительно нужно относиться с бооольшой осторожностью, особенно если пользователь имеет доступ к входным данным для него.
    А вот eval в яваскрипте абсолютно безопасен, ибо работает на стороне клиента и ничего с Ваши сервером сделать не может:)
     
  5. Black Hat

    Black Hat Постоялец

    Регистр.:
    15 май 2015
    Сообщения:
    132
    Симпатии:
    87
    Не совсем так. Допустим, через аякс подгружается блок контента неважно чего, но пользователи это способны менять этот контент. Например, последние комментарии.

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

    Код:
    // 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 вовсе не безопасен.

    Вот пруф
     
    Последнее редактирование: 27 июл 2015