Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #29, АПРЕЛЬ 2003 г.

МАСКИРОВКА В СЕТИ - персональный фильтр базара

 

Спецвыпуск Xakep, номер #029, стр. 029-066-2


Теперь давай посмотрим на главное окошко, слева есть куча галочек, по очереди сверху вниз: фильтр страницы, фильтр исходящего заголовка (версия браузера и пр.), фильтр входящего заголовка (MIME-fix и пр.), заморозка анимированных гифок и пользоваться или нет проксиком. Все эти галочки (кроме Remote proxy) отрубаются одним нажатием на кнопку Bypass. Кнопка Abort позволяет прервать все соединения одним разом, очень помогает при глобальном подвисании кучи окон. Кнопка LogWindow очень пригодится при разработке нестандартного веб-приложения, все отчетливо видно, что улетело, что прилетело и почему была ошибка, эдакий он-лайн дебаггер трафика. HTTP-Proxy это то самое место, где можно прописать внешний проксик. Я лично использовал его для проверки анонимности, потому как видно, что прилетает от проксика. Web pages и Headers используются для настройки фильтра трафика на языке метасимволов. Разбираться начнем с более простого - с Headers. Для начала - имя хедера, возьмем для разбора на запчасти LastModified. После имени стоит URL match, оставим пустой, нам все равно, с какого адреса это пришло. Header value match - чему должно быть равно значение хедера, звездочка означает, что менять будем всю строку. Replacement text - текст на что менять, пустота значит просто стирать. Теперь кратко о полях для страничного фильтра. Filter-name никак не влияет на работоспособность, URL match - таргетинг на конкретный адрес, Allow for multiple matches - означает, что таких совпадений может быть несколько на страницу и не стоит останавливаться после первой найденной. Bounds match - границы поиска, не стоит тут ставить * - это будет весьма солидно грузить тачку, а следовательно, и тормозить наш комп. Byte limit - это если было найдено начало границы, но никак нет конца (ну, забыли тег закрыть горе-дезигнеры), так вот, это максимальный размер проверяемого кусочка, это же значение используется при запоминании, если стоит "*". Matching expression - это, собственно, то, что прокс будет искать на страничке. Replacement text - на что будет заменять. Кнопочка test позволяет отдебажить наш скрипт, нажав на нее, в верхнее окошко вводим пример (я обычно ввожу просто source со странички) и давим на test; если все нормально, давим done.

Кодим в проксе

Все, с мелкими настройками покончено, теперь давай погрузимся в дебри программирования и обработки строк. Все правила абсолютно безразличны к регистру. Символ "*" это строка любых символов и любой длины. Знак "?" соответствует одному любому символу. Используя скобки "[]", можно задавать перечисления символов [asdfg], можно диапазон [a-z3-5], можно несоответствие [^a-z] = не буквы. Для чисел есть еще диапазон [#50-200], будет соответствовать числу от 50 до 200, а выражение [#3-*] значит больше трех, можно применить [#453], при этом не будет обращаться внимание на нули вначале и присутствие кавычек вокруг. Символ пробела позволяет выкидывать любое количество пробелов, идущих подряд, что весьма удобно при обработке html, при этом пробелов может не быть совсем. Очень похожа работа символа "\s", но в данном случае должен быть хотя бы один пробел для соответствия. Если надо найти или заменить именно символ табуляции, то используй "\t", аналогично перевод каретки "\r" и символ новой строки "\n". Для сравнения тегов наиболее подходящий символ "\w", он принимает любое количество символов (не пробелов или табуляций) и перестает искать, как только находит пробел или символ ">". Есть также и переменные(\0,\1...\9), которые можно брать во время поиска и подставлять после поиска. Все переменные существуют локально, то есть для каждой правила свои. Например, если надо поменять значение всех картинок, то можно проделать следующее: нужно менять "< img \1 src=* \2 >" на "< img \1 src=mypicture.gif \2 >" - таким образом у нас сохранятся все остальные параметры и поменяется только сама картинка. В переменную можно также поместить конкретное найденное слово, используя скобки: (asd\w )\1 - поместит слово, начинающееся на asd. Имеются также и логические операции, например, для поиска тега iframe или layout можно написать iframe|layout, то есть "|" это логическое "или". Для поиска "flopy disk или disk flopy" лучше использовать оператор & (логическое "и"), у нас получится disk&flopy, но это не будет соответствовать только одному из слов. Для поиска слов door и doom можно использовать круглые скобки doo(r|m), такое выражение найдет оба слова. Для поиска повторяющихся символов используй "+", то есть, чтобы заменить все doom, doooooom и dom на dem, нужно менять "do+m" на "dem". Единственная проблема: если искать r+root, то прокс ничего не найдет, так как первый символ "r" из рута съест поиск. Для того чтобы он нашел, надо использовать ++, то есть r++root, и прокс все сделает правильно. Кавычки будут соответствовать и одинарным, и двойным кавычкам. Есть также метасимволы, которые ничего не ищут, а просто производят действие. Так, например, \k убивает соединение, что полезно при фильтрации страниц. Символ "\u" - вставляет весь URL, \h - только имя хоста, \p - только путь, \a вставляет имя внутренней ссылки (якоря, то что идет в адресе после #), \d подставляет file://каталог,_где_стоит_прокометрон, удобно использовать для подмены картинок или файлов локальными. Помимо метасимволов, в последних версиях появились команды, они все начинаются с бакса. $AV - ищет значение, не смотря на кавычки, так <img src=($av(\0))\1>, теперь в \0 лежит адрес картинки, а в \1 лежит адрес в кавычках (если они были). Если надо сохранить только выражение с кавычками, то лучше использовать $avq(\0). Для сравнения с условием, которое хранится в файле, достаточно написать $lst(filename), это как команда #include в сях или флеше. Следующая команда это $nest, он позволяет искать среди тегов, так $nest(<body>,\0,</body>) запомнит все, что находится внутри тегов, в переменную "\0". Командой $set можно принудительно прописать переменную $set(0=home) или переназначить одной переменной другую $set(0=\1). Команда $stop() - остановит весь последующий поиск. Вот, собственно, и все, чем я реально пользовался, остальное можно найти в хелпе к проге.

Назад на стр. 029-066-1  Содержание  Вперед на стр. 029-066-3