Об удалении квотированных строк из текста JavaScript

    Как часть программы анализа исходных кодов было необходимо вырезать из JavaScript все строковые литералы. Сначала на PHP был реализован state based парсер, но это было медленно и уныло. А сделать быстро получилось с помощью регулярных выражений.

    Источником вдохновения послужил пост на stackoverflow. В результате получилось следующее решение:
    return preg_replace('/(
    "[^"\\\\]*(?:\\\\.[^"\\\\]*)*" # match double quoted string
    |
    \'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\' # match single quoted string
    |
    (?s:\\/\\*.*?\\*\\/) # multiline comments
    |
    \\/\\/.*?\\n # singleline comments
    |
    string.replace\\(\\/[^\\/\\\\]*(?:\\\\.[^\\/\\\\]*)*\\/ # an JS regexp
    )/x', '', $str);

    И это во много раз быстрее анализатора, пятьдесят строчек которого канули в Лету.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 18

      +4
      Hello world!
        +4
        Представляю, как запутается человек не знакомый с программингом в этом облаке смайлов ;)
          0
          Ну да, конечно, а в анализаторе на 50 строчек в 5 секунд разберётся )))
          0
          Простите, а что такое «50-ть»?
            0
            Пятьдесятть, что непонятного.
              +3
              Точно? Не пятьдесят-ть? :)
            –2
            Мягкий знак в «50-ть» явно лишний написал. Первый пост — дрожали ручки.
              +2
              Мне кажется тут не только мягкий знак, но и вся часть "-ть". Зачем она вообще?
              +8
              Нельзя распарсить джаваскрипт при помощи регексов — потому что джаваскрипт распарсить регулярными выражениями невозможно. Регулярные выражения это неподходящий инструмент для корректного парсинга javascript. Использование регулярок не позволит разобрать код, написанный на javascript. Регулярные выражения — технология, недостаточно изощрённая для понимания конструкций, используемых в джаваскрипте. ECMAScript это не регулярный язык, а следовательно, он не может быть разобран при помощи regular expressions. Регексы не предназначены для разбиения кода на джавасркипте на осмысленные составляющие. Сколько уже раз… я так и не могу понять. Даже иррегулярные регулярные выражения, используемые Перлом, не смогут распарсить HTML. Вам меня не заткнуть. Джаваскрипт — язык достаточной большой сложности, который нельзя распарсить регулярками. Даже Джон Скит не может распарсить джаваскрипт регулярками. Каждый раз, когда ты парсишь джаваскрипт регексами, Путин ест младенца и запивает кровью девственниц, а китайские хакеры ломают твой сайт. Парсинг любого си-подобного языка программирования при помощи regexp'ов призывает блуждающие души в мир живых. Джаваскрипт и регуярные выражения подходят друг другу как любовь, брак и ритуальное детоубийство. <center> не устоит уже слишком поздно. Мощь регулярных выражений и джаваскрипт, находящиеся в одном концептуальном пространстве, взорвут твой мозг, как японские телешоу. Если ты парсишь ES 3 регулярками, ты поддаёшься Им и Их кощунству, которое обрекает нас всех на нечеловеческий труд Тому, Чьё имя не может быть выражено символами Юникода, он грядёт. Джавасkрипт плюс ре͢гулярны̢е̧ выражения расплавят нервные окончания живых существ, пока ты будешь наблюдать, твоя психика увядать с натиском непередаваемого ужаса. Парсеры javascript, основанные не regex'ах, — раковая опухоль, пожирающая Сеть уже поздно уже слишком поздно нас не спасти преступление млад͡е̨нца заставит регексы поглотить всю живую материю, кроме кода на джаваскрипте, который они не смогут поглотить, как и было предсказано господи милостивый помоги нам как кто-либо может вынести это беdствие использования регулярных выражений для парсинга джаваскрипtа обрекло человечество на страшные мучения и дыры в безопасности использование regu͔̣̳̤͚̱̥͜lar e̷x̡pr̀e͏ssions̛ как инструмента обработки javаscripт-кода создаёт брешь между этим миром и ужасным царством исп̴ор͘чен̛ных̀ сущностей (как ExtJS, но более испорченных) лишь мимолётный взгляд на мир reгex-парсеров для jaвascrиptа мгновенно переносит разум программиста в мир неумолкающего плача, он грядёт, зловредная ползучая реGeкс-инфекция поглотит твой джаваскрипт-парсер, приложения и существование навсегда как вижуал.̢бейсик только хуже он грядёт он грядёт не боритесь он грядёт, е̴го н͝е̴че̨cт̴ивое̧ вели̛ко҉ле̕пие уничтожает просветление, javascript-выражения текут҉ из т͏в̢оих г̧ла̷з, к͢а̧к ҉жи̧дкая боль, песнь re̸gex-паrсинга искоренит голоса смертного из̨ Сферы я вижу а ты видишь? э̢т̴о̸ прекрасно последний вдох лжи чЧеловека В̶С̷Ё͜ ПОТЕ̨Р҉Я҉Н҉О̵ ВСЁ ПОТЕРЯНО pon̷y он гря̡дё̷т̛ он грͫ̊яд̓̂̇̏̉ͣ̓ё̄т he c҉om̴es̨ Ихор прон͛ͫи́к͒͂ͨ̈̔ͥа́ͬ͒̆ͣе̓ͣ̀ͬ͗̇тͩ͌̋̿͌ в МОЁ ЛИ̤̥͕͝Ц̤͎͎̟̹̪ͅО͎̳ М̲̺̂͂ͯ͆̈́͡О̞̠̹͙͔̟̇ͮͣЁ̵̫̲̞̊̈́̆̆̒̚ ͈̠͙̄ͧ̎ͭЛ̜̜̮͇̳ͤͯИ̔̀̅ͮЦ͓̪̲̱̤ͨ̅̓̎О͎̑̈̑͝ о боже нет НЕЕЕ͝ЕТ НЕ͇̭̥̯͚͈̿͛ͣ͐͘Т̺͎̖̪͙̳̪̕ о̶с̛т̶а͏͏̢н҉͡͡о͏͜͜в̴и͜͠͠с̛ь ш̐ͨ̍̓ͣͮ̐͏̻̦̠͎̦̣͎м̴̴̻̞̟͍̟̠ͨ̍͡ͅе̨̙̪̰͉̟͙̪͒̔͛̊͝л̽ͥ̃̇҉̝͖͙͉̘̭̩͙ь̧̗́ͬ̋͋̏̉͘ не нас̵̧́́͠т҉̛оящий М͇̫̟͔͕͕̄ͯ̃͐͜И̠͔̌ͦ͒ͣ̍͞Ц̡̝Г͠ОЛ̴ ZA̡͊͠͝LGO̶̥̠͖̲͡ ЭТО М̴̳̫̝̠̱̦̙ͭ̌ͫ̀̓́̅И̛ͮͯͨͩͧͩͫ̚҉͕̙͇̫Ш̵̵̵͉̙̞͕͎̫̖͍̽̚К̷̛̱̭̼̔̆̔̇́̓̉И̤͚̘̟̦̥̥͎̖ͥ̏̀͒̓̿͟ ̳͗ͥ̓́̃Г̒̽͏̵͕̫̯̟̗̩ͅА̞̜̽͌М̶̵̰̬͌ͦ͋̒̍͗͘М̵̞̱͍̙͔̇͆̀Й̙̟̺̱͉͚̯͚̟ͧ̔̀͆͝͠ О̖̞͔̰̹̜̿̔̒ͪ̓̑͟Н̰̥̖̞̾ͮ͛ ̨̗̗̥̦̮̣̭̾Г̢̮̒͌̆̈̾̏Р̳̳̪̪̭̮͕̾̓͛̍͞Я̺̖̦͓̀͐̂Д͎͙̞̮͉̝͊ͣ̈̄Ё͈̠̯̜̾ͨ͡Т
                +1
                Дочитал.
                  +1
                  Если что, вот оригинал: stackoverflow.com/a/1732454/1115648
                    +1
                    что характерно, в оригинале речь идет о русских хакерах, а не о китайских
                  +2
                  А этот рецепт не для парсинга JavaScript и уж тем более HTML.
                  Задача была — удалить литеральные строки.
                  И задача была решена.
                  • UFO just landed and posted this here
                      0
                      Подозреваю что у автора то же самое что и у одного проекта который я поддерживаю, там представление очень сильно перемешано с бизнес логикой и html + js формируются на сервере прямо из кода (причём не при помощи json_encode, а вручную (кстати, сериализацию/десериализацию тоже адскими foreach делают)), за исправление этого недоразумения никто платить не хочет, а проблемы из-за этого возникают нешуточные, в частности мне пришлось написать свою escape функцию.
                    0
                    Вот у вас есть страничка с php кодом (очень глупым и не безопасным, вы ведь так никогда не напишете?):


                    А вот злой взломщик делает запрос silly_page.php?control_id=';alert(33).
                    Удалив литералы и сравнив оставшийся JS со значениями переменных запроса можно предотвратить XSS.
                      0
                      <script>
                      var a = '<?echo $_GET["control_id"];?>';
                      //Далее что-то полезное...
                      </script>
                      


                        0
                        На самом деле тут проблема проще решается использованием какого-нибудь хорошего шаблонизатора, например, twig. Одновременно с этим вы получите разделение поведения и представления + упростите код для понимания. И сделаете первый шаг навстречу к удобству тестирования кода.

                        P.S. да и приведение типа данных полученных извне никто не отменял.

                    Only users with full accounts can post comments. Log in, please.