1. JavaScript / Говнокод #5896

    +167

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    switch (ch) {
                case 't':
                    next('t');
                    next('r');
                    next('u');
                    next('e');
                    return true;
                case 'f':
                    next('f');
                    next('a');
                    next('l');
                    next('s');
                    next('e');
                    return false;
                case 'n':
                    next('n');
                    next('u');
                    next('l');
                    next('l');
                    return null;
                }
                error("Unexpected '" + ch + "'");
            },

    https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js

    Запостил: nin-jin, 05 Марта 2011

    Комментарии (21) RSS

    • вся суть функцианалоблядков.
      Ответить
    • тьюринг
      Ответить
    • А что не так? Всё правильно вроде.
      Ответить
      • копипаста на каждую букву. страшно даже представить как бы он писал парсер яваскрипта.
        Ответить
        • В json всего три ключевых слова и других идентификаторов нет. Нормальный код, так и делают несложные самописные парсеры.

          А как бы сделали вы?
          Ответить
          • может что-нибудь наподобие "serialize - unserialize" ?
            Ответить
            • А поконкретнее? Перепишите, пожалуйста, этот кусок с "serialize - unserialize".
              Ответить
              • Извините, json'ом как-то не очень увлекаюсь...
                В целом и общем, зачем парсить ответ сервера, если его можно преобразовать в js-понятный фразеологизм средствами самого js.
                Ответить
                • Ну так и сделано -- парсер написан на JavaScript.
                  Ответить
                  • Парсер парсера... smarty направление...
                    Без конфиденциальностей - достаточно regexp + eval, думаю...
                    Ответить
                    • Э? Как вы на regexp парсинг json сделаете?
                      Ответить
                      • Парсить eval будет... а regexp'ом некую валидацию делать.
                        Ответить
                        • Regexp для валидации в студию.
                          Ответить
                          • ну незнаю... что-нибудь наподобие:
                            var json = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(data.replace(/"(\\.|[^"\\])*"/g, ''))) && eval(' (' + data + ') ');

                            --
                            хотябы...
                            Ответить
                            • Универсальный эксплойт (выполнение произвольного кода) я к этому не придумаю, но в некоторых частных случаях хак возможен. Дело в том, что можно подсунуть eval-у произвольный идентификатор. Т.е. клиент получит совсем не то, что отправлял сервер-злоумышленник, а некую приватную информацию.
                              Ответить
                              • А зачем, вообще, использовать подобное (json) для обмена конфиденциальными данными? К таким данным - исключительно отдельный подход. Для остальных данных, менее важных, с точки зрения безопасности, eval подходит как нельзя хорошо.
                                Ответить
                                • Ловушка здесь в том, что привыкнув использовать eval в одних случаях, вы можете не заметить, как перейдёте границу и воспользуетесь им в небезопасном контексте. Красная лампочка не загорится.
                                  Ответить
          • как минимум вынес бы в отдельную функцию

            case 't':
            nextString('true');
            return true;

            как максимум - http://ru.wikipedia.org/wiki/Lexical_analysis
            Ответить
            • Сэкономили бы 10 строчек в этом месте и потратили бы их на определение функции, которая используется только здесь. Плюс рассеяние внимания, отвлечение к реализации функции вместо и так довольно очевидного кода. В общем -- шило на мыло, принципиально варианты не отличаются.

              Собственно, перед нами и есть простой лексический анализатор. Поскольку все три ключевых слова отличаются первой же буквой, ничего другого и не надо.
              Ответить
              • ты фееричный говноадвокат.

                это не простой, это невъебенно тупой синтаксический анализатор
                Ответить
    • пришла посылка тчк ждите новостей зпт
      Ответить

    Добавить комментарий